/ Hex Artifact Content
Login

Artifact 494d106959a492838ab3723e284de46ddd520da1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ral index */../*
2c40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2c50: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2c60: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2c70: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2c80: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2c90: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2ca0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2cb0: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2cc0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2cd0: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2ce0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2cf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2d00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2d20: 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70 69  skSet   /* Mappi
2d30: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2d40: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2d50: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20  bitmasks */.){. 
2d60: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2d70: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2d80: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2d90: 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  t;.  pWC->nTerm 
2da0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
2db0: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
2dc0: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
2dd0: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
2de0: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
2df0: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  sk = 0;.}../* Fo
2e00: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2e20: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2e30: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
2e40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2e50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2e60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2e70: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
2e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e90: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
2ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2eb0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
2ec0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
2ed0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
2ee0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ef0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
2f00: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2f10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2f20: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
2f30: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
2f40: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
2f50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
2f60: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
2f70: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
2f80: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
2f90: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
2fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2fc0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
2fd0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
2fe0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2ff0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
3000: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
3010: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3020: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
3030: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3040: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
3050: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
3060: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
3070: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
3080: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
3090: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
30a0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
30b0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
30c0: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
30d0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
30e0: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
30f0: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
3100: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
3110: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3120: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
3130: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
3140: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
3150: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3160: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
3170: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
3180: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3190: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
31a0: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
31b0: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
31c0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
31d0: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
31e0: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
31f0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3210: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3230: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
3240: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
3250: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
3260: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
3270: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
3280: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
3290: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
32a0: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
32b0: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
32c0: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
32d0: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
32e0: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
32f0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3300: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3310: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3320: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3330: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3340: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
3350: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
3360: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3370: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
3380: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
3390: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
33a0: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
33b0: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
33c0: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
33d0: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
33e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
33f0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3400: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3410: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3420: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3430: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3440: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
3450: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
3460: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3470: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
3480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
3490: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
34a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
34b0: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
34c0: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
34d0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
34e0: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
34f0: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3500: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3510: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3520: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3530: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3540: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
3550: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
3560: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
3570: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
3580: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
3590: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
35a0: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
35b0: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
35d0: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
35e0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
35f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3600: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3610: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3620: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3630: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3640: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
3650: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
3660: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
3670: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
3680: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
3690: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
36a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
36b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
36c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
36d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
36e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3700: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3710: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3720: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3730: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3740: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
3750: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
3760: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
3770: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
3780: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3790: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
37a0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
37b0: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
37c0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
37d0: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
37e0: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
37f0: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3800: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3810: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3820: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3830: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
3850: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
3860: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
3870: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
3880: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
3890: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
38a0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
38b0: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
38c0: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
38d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
38e0: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
38f0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
3900: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
3910: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
3920: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3930: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
3940: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
3950: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3960: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
3970: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
3980: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
3990: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
39a0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
39b0: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
39c0: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
39d0: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
39e0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
39f0: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
3a00: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
3a10: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
3a20: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3a30: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
3a40: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
3a50: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
3a60: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
3a70: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
3a80: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
3a90: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
3aa0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3ab0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
3ad0: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
3ae0: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
3af0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
3b00: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
3b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
3b20: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
3b30: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
3b40: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
3b50: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
3b60: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
3b70: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
3b80: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
3b90: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
3ba0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
3bb0: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
3bc0: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
3bd0: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
3be0: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
3bf0: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
3c00: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
3c10: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
3c20: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3c30: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
3c40: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3c50: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
3c60: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
3c70: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
3c80: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
3c90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
3ca0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3cb0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
3cc0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
3cd0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
3ce0: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
3cf0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3d00: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
3d10: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
3d20: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3d30: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
3d40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
3d50: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
3d60: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
3d70: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
3d80: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
3d90: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
3da0: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
3db0: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
3dc0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
3dd0: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
3de0: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
3df0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
3e00: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
3e10: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
3e20: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
3e30: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
3e40: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3e50: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
3e60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3e70: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e  pMaskSet->n<=(in
3e80: 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  t)sizeof(Bitmask
3e90: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
3ea0: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
3eb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
3ec0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
3ed0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
3ee0: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
3ef0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
3f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3f10: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
3f20: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
3f30: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
3f40: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
3f50: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
3f60: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
3f70: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
3f80: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
3f90: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3fa0: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
3fb0: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
3fc0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
3fd0: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
3fe0: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
3ff0: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
4000: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
4010: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
4020: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
4030: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
4040: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
4050: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
4060: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
4070: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
4080: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
4090: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
40a0: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
40b0: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
40c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
40d0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
40e0: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
40f0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
4100: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
4110: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
4120: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
4130: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
4140: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
4150: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
4160: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
4170: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
4180: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
4190: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
41a0: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
41b0: 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f  oked sqlite3Reso
41c0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f  lveExprNames() o
41d0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
41e0: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
41f0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
4200: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
4210: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
4220: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
4230: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
4240: 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  prNames() routin
4250: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
4260: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
4270: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
4280: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
4290: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
42a0: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
42b0: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
42c0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
42d0: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
42e0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
42f0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
4300: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
4310: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
4320: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
4330: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
4340: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
4350: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4360: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4370: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4380: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
4390: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
43a0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
43b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
43c0: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
43d0: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
43e0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
43f0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
4400: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
4410: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
4420: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4430: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
4440: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
4450: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
4460: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
4470: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
4480: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
4490: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
44a0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
44b0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
44c0: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
44d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
44e0: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
44f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4500: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4510: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
4520: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4530: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4540: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
4550: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
4560: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4570: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4580: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
4590: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
45a0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
45b0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
45c0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
45d0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
45e0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
45f0: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
4600: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
4610: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
4620: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4630: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
4640: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4650: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4660: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4670: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
4680: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4690: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
46a0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
46b0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
46c0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
46d0: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
46e0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
46f0: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
4700: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
4710: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4720: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
4730: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4740: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4750: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4760: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
4770: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4780: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4790: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
47a0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
47b0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
47c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
47d0: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
47e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
47f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
4800: 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d  aving);.    pS =
4810: 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d   pS->pPrior;.  }
4820: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4830: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4840: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
4850: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
4860: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
4870: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
4880: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
4890: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
48a0: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
48b0: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
48c0: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
48d0: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
48e0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a  ", and "IN"..**.
48f0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
4900: 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36  N-OF: R-59926-26
4910: 33 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65  393 To be usable
4920: 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74   by an index a t
4930: 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f  erm must be.** o
4940: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
4950: 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f  lowing forms: co
4960: 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f  lumn = expressio
4970: 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65  n column > expre
4980: 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ssion.** column 
4990: 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  >= expression co
49a0: 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f  lumn < expressio
49b0: 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72  n column <= expr
49c0: 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73  ession.** expres
49d0: 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78  sion = column ex
49e0: 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d  pression > colum
49f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20  n expression >= 
4a00: 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73  column.** expres
4a10: 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78  sion < column ex
4a20: 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75  pression <= colu
4a30: 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20  mn column IN.** 
4a40: 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74  (expression-list
4a50: 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62  ) column IN (sub
4a60: 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53  query) column IS
4a70: 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20   NULL.*/.static 
4a80: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
4a90: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
4aa0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
4ab0: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
4ac0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
4ad0: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
4ae0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4af0: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
4b00: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
4b10: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
4b20: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
4b30: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
4b40: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
4b50: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
4b60: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
4b70: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
4b80: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
4b90: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
4ba0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
4bb0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
4bc0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
4bd0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
4be0: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
4bf0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
4c00: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
4c10: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
4c20: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
4c30: 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  * If a collation
4c40: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73   sequence is ass
4c50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74  ociated with eit
4c60: 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20  her the left or 
4c70: 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66  right.** side of
4c80: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c   the comparison,
4c90: 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f   it remains asso
4ca0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4cb0: 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a  same side after.
4cc0: 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69  ** the commutati
4cd0: 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74  on. So "Y collat
4ce0: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
4cf0: 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f  ecomes .** "X co
4d00: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
4d10: 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  Y". This is beca
4d20: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
4d30: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
4d40: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
4d50: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
4d60: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
4d70: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
4d80: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
4d90: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
4da0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
4db0: 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f  son the EP_ExpCo
4dc0: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
4dd0: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
4de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
4df0: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
4e00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4e10: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
4e20: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
4e30: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
4e40: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a  EP_ExpCollate);.
4e50: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
4e60: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
4e70: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4e80: 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  late);.  assert(
4e90: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
4ea0: 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e  ->op) && pExpr->
4eb0: 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70  op!=TK_IN );.  p
4ec0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
4ed0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
4ee0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
4ef0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4f00: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
4f10: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
4f20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
4f30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
4f40: 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65  );.  SWAP(CollSe
4f50: 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  q*,pExpr->pRight
4f60: 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70  ->pColl,pExpr->p
4f70: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20  Left->pColl);.  
4f80: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4f90: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
4fa0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e  Right->flags & ~
4fb0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c  EP_ExpCollate) |
4fc0: 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70   expLeft;.  pExp
4fd0: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4fe0: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
4ff0: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
5000: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69  Collate) | expRi
5010: 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72  ght;.  SWAP(Expr
5020: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
5030: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5040: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
5050: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
5060: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
5070: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
5080: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
5090: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
50a0: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
50b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
50c0: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
50d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
50e0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
50f0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
5100: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
5110: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
5120: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
5130: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
5140: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
5150: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
5160: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
5170: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
5180: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
5190: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
51a0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
51b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
51c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
51d0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
51e0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
51f0: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
5200: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
5210: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
5220: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
5230: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
5240: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
5250: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
5260: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
5270: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
5280: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
5290: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
52a0: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
52b0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
52c0: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
52d0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
52e0: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
52f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5300: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
5310: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
5320: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
5330: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
5340: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
5350: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
5360: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
5370: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
5380: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
5390: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
53a0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
53b0: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
53c0: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
53d0: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
53e0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
53f0: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
5400: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
5410: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
5420: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
5430: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
5440: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
5450: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
5460: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
5470: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
5480: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e  c WhereTerm *fin
5490: 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c  dTerm(.  WhereCl
54a0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
54b0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
54c0: 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  se to be searche
54d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
5500: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43   LHS */.  int iC
5510: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
5520: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
5530: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74   of LHS */.  Bit
5540: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
5550: 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e     /* RHS must n
5560: 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20  ot overlap with 
5570: 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75  this mask */.  u
5580: 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  32 op,          
5590: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
55a0: 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73  WO_xx values des
55b0: 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72  cribing operator
55c0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
55d0: 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x           /* M
55e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
55f0: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
5600: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
5610: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
5620: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b   *pTerm;.  int k
5630: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ;.  assert( iCur
5640: 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57  >=0 );.  op &= W
5650: 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65  O_ALL;.  for(pTe
5660: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
5670: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
5680: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
5690: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
56a0: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
56b0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65    && (pTerm->pre
56c0: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
56d0: 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ady)==0.       &
56e0: 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  & pTerm->u.leftC
56f0: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
5700: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
5710: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29  >eOperator & op)
5720: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
5730: 20 69 66 28 20 70 49 64 78 20 26 26 20 70 54 65   if( pIdx && pTe
5740: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
5750: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
5760: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5770: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5780: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
5790: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
57a0: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
57b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
57c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
57d0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
57e0: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
57f0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
5800: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
5810: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
5820: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
5830: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
5840: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
5850: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;..        /* Fi
5860: 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c  gure out the col
5870: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5880: 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e  required from an
5890: 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20   index for.     
58a0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
58b0: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
58c0: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
58d0: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
58e0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
58f0: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
5900: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
5910: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
5920: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
5930: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
5940: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
5950: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
5960: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
5970: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ht);.        ass
5980: 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61  ert(pColl || pPa
5990: 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20  rse->nErr);..   
59a0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49       for(j=0; pI
59b0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
59c0: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
59d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
59e0: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
59f0: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
5a00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5a10: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
5a20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5a30: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
5a40: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
5a50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5a60: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
5a70: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTerm;.    }.  }
5a80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5a90: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5aa0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
5ab0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
5ac0: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
5ad0: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
5ae0: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
5af0: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
5b00: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
5b10: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
5b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5b30: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
5b40: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5b50: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
5b60: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
5b70: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5b90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5ba0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5bb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5bc0: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5bd0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5be0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
5bf0: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
5c00: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5c20: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
5c30: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5c40: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5c50: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
5c60: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5c70: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
5c80: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5c90: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5ca0: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5cb0: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5cc0: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5cd0: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
5ce0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
5cf0: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
5d00: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
5d10: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
5d20: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
5d30: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
5d40: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
5d50: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
5d60: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
5d70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5d80: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
5d90: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5da0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5db0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5dc0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
5de0: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
5df0: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
5e00: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
5e10: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
5e20: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
5e30: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
5e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5e50: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
5e60: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
5e70: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
5e80: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5e90: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5ea0: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5eb0: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5ec0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5ed0: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
5ee0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5ef0: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5f00: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5f10: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5f20: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
5f30: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
5f40: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5f50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5f60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
5f70: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
5f80: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
5f90: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
5fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fb0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
5fc0: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
5fd0: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ff0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
6000: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
6010: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
6020: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
6030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
6040: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
6050: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6070: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6080: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
6090: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
60a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
60d0: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
60e0: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
60f0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
6100: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
6110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6120: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
6130: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
6140: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
6150: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
6160: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6170: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
6180: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6190: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
61a0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
61b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
61c0: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
61d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
61e0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
61f0: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
6200: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
6210: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
6220: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
6230: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
6240: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
6250: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
6260: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
6270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6280: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
6290: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
62a0: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
62b0: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
62c0: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
62d0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
62e0: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
62f0: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
6300: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
6310: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
6320: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
6330: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
6340: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
6350: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
6360: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
6370: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6380: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
6390: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
63a0: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
63b0: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
63c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
63d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
63e0: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
63f0: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
6400: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
6410: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
6420: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6430: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
6440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6450: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
6460: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 20 2f 2a  pVdbe, iCol); /*
6470: 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32   IMP: R-23257-02
6480: 37 37 38 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  778 */.    asser
6490: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
64a0: 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52  K_VARIABLE || pR
64b0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ight->op==TK_REG
64c0: 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65  ISTER );.  }else
64d0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
64e0: 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52  NG ){.    z = pR
64f0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
6500: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20    }.  if( z ){. 
6510: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
6520: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
6530: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
6540: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
6550: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
6560: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
6570: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
6580: 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d   255!=(u8)z[cnt-
6590: 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  1] ){.      Expr
65a0: 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20   *pPrefix;.     
65b0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
65c0: 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  c==wc[0] && z[cn
65d0: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70  t+1]==0;.      p
65e0: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
65f0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49  Expr(db, TK_STRI
6600: 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  NG, z);.      if
6610: 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65  ( pPrefix ) pPre
6620: 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e  fix->u.zToken[cn
6630: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  t] = 0;.      *p
6640: 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69  pPrefix = pPrefi
6650: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  x;.      if( op=
6660: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6670: 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
6680: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
66a0: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76  VdbeSetVarmask(v
66b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
66c0: 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33  n); /* IMP: R-23
66d0: 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20  257-02778 */.   
66e0: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
66f0: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
6700: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
6710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
6720: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
6730: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
6740: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
6750: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
6760: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
6770: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
6780: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
6790: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
67a0: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
67b0: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
67c0: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
67d0: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
67e0: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
67f0: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
6800: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
6810: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
6820: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
6830: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
6840: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
6850: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
6860: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
6870: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
6880: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
6890: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
68a0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
68b0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
68c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
68d0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
68e0: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
68f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6900: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
6910: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
6920: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
6930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6940: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6950: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6970: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6980: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
6990: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
69a0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
69b0: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
69c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
69d0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
69e0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
69f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6a00: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6a10: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
6a20: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
6a30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
6a40: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
6a50: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
6a60: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
6a70: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
6a80: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
6a90: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
6aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6ab0: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
6ac0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
6ad0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
6ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
6af0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
6b00: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
6b10: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
6b20: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
6b30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
6b40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
6b50: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
6b60: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
6b70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6b80: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
6b90: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
6ba0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
6bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6bc0: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
6bd0: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
6be0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
6bf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6c00: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
6c10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6c20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6c30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
6c40: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
6c50: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
6c60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
6c70: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
6c80: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
6c90: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
6ca0: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
6cb0: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
6cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
6cd0: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
6ce0: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
6cf0: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
6d00: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
6d10: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
6d20: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
6d30: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
6d40: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
6d50: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
6d60: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
6d70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6d80: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
6d90: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
6da0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
6db0: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
6dc0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
6dd0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
6de0: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
6df0: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
6e00: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
6e10: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
6e20: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
6e30: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
6e40: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
6e70: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
6e80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
6e90: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
6ea0: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
6eb0: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
6ec0: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
6ed0: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
6ee0: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
6ef0: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
6f00: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
6f10: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
6f20: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
6f30: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
6f40: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
6f50: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6f60: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
6f70: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
6f80: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
6f90: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
6fa0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
6fb0: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
6fc0: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
6fd0: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
6fe0: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
6ff0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
7000: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
7010: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
7020: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
7030: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
7040: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
7050: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
7060: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
7070: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
7080: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
7090: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
70a0: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
70b0: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
70c0: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
70d0: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
70e0: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
70f0: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
7100: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
7110: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
7120: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
7130: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
7140: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
7150: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
7160: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
7170: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
7180: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
7190: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
71a0: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
71b0: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
71c0: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
71d0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
71e0: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
71f0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
7200: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
7210: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
7220: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
7230: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
7240: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
7250: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
7260: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
7270: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
7280: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
7290: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
72a0: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
72b0: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
72c0: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
72d0: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
72e0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
72f0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
7300: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
7310: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
7320: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
7330: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
7340: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
7350: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
7360: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
7370: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
7380: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
7390: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
73a0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
73b0: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
73c0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
73d0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
73e0: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
73f0: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
7400: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
7410: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
7420: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
7430: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
7440: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
7450: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
7460: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
7470: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
7480: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
7490: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
74a0: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
74b0: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
74c0: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
74d0: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
74e0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
74f0: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
7500: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
7510: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
7520: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
7530: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
7540: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
7550: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
7560: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
7570: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
7580: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
7590: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
75a0: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
75b0: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
75c0: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
75d0: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
75e0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
75f0: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
7600: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
7610: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
7620: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
7630: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
7640: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
7650: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
7660: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
7670: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
7680: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
7690: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
76a0: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
76b0: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
76c0: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
76d0: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
76e0: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
76f0: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
7700: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
7710: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
7720: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
7730: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
7740: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
7750: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
7760: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
7770: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
7780: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
7790: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
77a0: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
77b0: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
77c0: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
77d0: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
77e0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
77f0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
7800: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
7810: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
7820: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
7830: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
7840: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
7850: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
7860: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
7870: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
7880: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
7890: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
78a0: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
78b0: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
78c0: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
78d0: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
78e0: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
78f0: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
7900: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
7910: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
7920: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
7930: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7940: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
7950: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
7960: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
7970: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
7980: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
7990: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
79a0: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
79b0: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
79c0: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
79d0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
79e0: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
79f0: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
7a00: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
7a10: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
7a20: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
7a30: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
7a40: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
7a50: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
7a60: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
7a70: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
7a80: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
7a90: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
7aa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
7ab0: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
7ac0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
7ad0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
7ae0: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pWC->pParse;  
7af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
7b00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7b10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7b20: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
7b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7b40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
7b50: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7b60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
7b70: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
7b80: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
7b90: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
7ba0: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
7bb0: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
7bc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7bd0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
7be0: 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  rm */.  WhereMas
7bf0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d  kSet *pMaskSet =
7c00: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20   pWC->pMaskSet; 
7c10: 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61 73  /* Table use mas
7c20: 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ks */.  int i;  
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
7c60: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7c70: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
7c80: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
7c90: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
7ca0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
7cb0: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
7cc0: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
7cd0: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
7ce0: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
7cf0: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
7d00: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
7d10: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
7d20: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
7d30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
7d40: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
7d50: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
7d60: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
7d70: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
7d80: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
7d90: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
7da0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
7db0: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
7dc0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
7dd0: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
7de0: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
7df0: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
7e00: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
7e10: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
7e20: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
7e30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
7e40: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
7e50: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
7e60: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
7e70: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
7e80: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
7e90: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
7ea0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
7eb0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
7ec0: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
7ed0: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
7ee0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7ef0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
7f00: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
7f10: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
7f20: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7f30: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7f40: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
7f50: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
7f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
7f70: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
7f80: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
7f90: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
7fa0: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
7fb0: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43 2d  Init(pOrWc, pWC-
7fc0: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
7fd0: 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  t);.  whereSplit
7fe0: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
7ff0: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
8000: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
8010: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
8020: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
8030: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
8040: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
8050: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
8060: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
8070: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
8080: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
8090: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
80a0: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
80b0: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
80c0: 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e 76 6d  ToIN = ~(pWC->vm
80d0: 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  ask);.  for(i=pO
80e0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
80f0: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8100: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
8110: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
8120: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
8130: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8140: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
8150: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
8160: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
8170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8180: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8190: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  r==0 );.      as
81a0: 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e  sert( (pOrTerm->
81b0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
81c0: 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49  ANDINFO|TERM_ORI
81d0: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NFO))==0 );.    
81e0: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
81f0: 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d        pAndInfo =
8200: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8210: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
8220: 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20  pAndInfo));.    
8230: 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29    if( pAndInfo )
8240: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
8250: 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20  lause *pAndWC;. 
8260: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
8270: 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20   *pAndTerm;.    
8280: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8290: 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30     Bitmask b = 0
82a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
82b0: 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20  m->u.pAndInfo = 
82c0: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
82d0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
82e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e  gs |= TERM_ANDIN
82f0: 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  FO;.        pOrT
8300: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
8310: 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   WO_AND;.       
8320: 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49   pAndWC = &pAndI
8330: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
8340: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
8350: 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50  (pAndWC, pWC->pP
8360: 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
8370: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
8380: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
8390: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
83a0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
83b0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
83c0: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
83d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
83e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
83f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
8400: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8410: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
8420: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
8430: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
8440: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
8450: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
8460: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8470: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20  pAndTerm->pExpr 
8480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8490: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e  f( allowedOp(pAn
84a0: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  dTerm->pExpr->op
84b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
84c0: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
84d0: 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65  pMaskSet, pAndTe
84e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64     }.        ind
8520: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
8530: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8540: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
8550: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
8560: 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b  D ){.      /* Sk
8570: 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72  ip this term for
8580: 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69   now.  We revisi
8590: 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f  t it when we pro
85a0: 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a  cess the.      *
85b0: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
85c0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72  TERM_VIRTUAL ter
85d0: 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  m */.    }else{.
85e0: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b        Bitmask b;
85f0: 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61  .      b = getMa
8600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
8610: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
8620: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
8630: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8640: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a  TERM_VIRTUAL ){.
8650: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
8660: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72  m *pOther = &pOr
8670: 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  Wc->a[pOrTerm->i
8680: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20  Parent];.       
8690: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d   b |= getMask(pM
86a0: 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e  askSet, pOther->
86b0: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
86c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78     }.      index
86d0: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
86e0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
86f0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29  perator!=WO_EQ )
8700: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
8710: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  IN = 0;.      }e
8720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  lse{.        chn
8730: 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20  gToIN &= b;.    
8740: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8750: 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20   /*.  ** Record 
8760: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8770: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8780: 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20  ase 2.  The set 
8790: 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d  might be.  ** em
87a0: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49  pty..  */.  pOrI
87b0: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d  nfo->indexable =
87c0: 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54   indexable;.  pT
87d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
87e0: 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20   indexable==0 ? 
87f0: 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a  0 : WO_OR;..  /*
8800: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68  .  ** chngToIN h
8810: 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61  olds a set of ta
8820: 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74  bles that *might
8830: 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  * satisfy case 1
8840: 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68  .  But.  ** we h
8850: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61  ave to do some a
8860: 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69  dditional checki
8870: 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73  ng to see if cas
8880: 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20  e 1 really.  ** 
8890: 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20  is satisfied..  
88a0: 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  **.  ** chngToIN
88b0: 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65   will hold eithe
88c0: 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74  r 0, 1, or 2 bit
88d0: 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61  s.  The 0-bit ca
88e0: 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  se means.  ** th
88f0: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  at there is no p
8900: 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72  ossibility of tr
8910: 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f  ansforming the O
8920: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e  R clause into an
8930: 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  .  ** IN operato
8940: 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72  r because one or
8950: 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74   more terms in t
8960: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e  he OR clause con
8970: 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68  tain.  ** someth
8980: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d  ing other than =
8990: 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  = on a column in
89a0: 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c   the single tabl
89b0: 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20  e.  The 1-bit.  
89c0: 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68  ** case means th
89d0: 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  at every term of
89e0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
89f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  s of the form.  
8a00: 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  ** "table.column
8a10: 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20  =expr" for some 
8a20: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
8a30: 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20  he one bit that 
8a40: 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c  is set.  ** will
8a50: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
8a60: 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e  he common table.
8a70: 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20    We still need 
8a80: 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  to check to make
8a90: 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73  .  ** sure the s
8aa0: 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73  ame column is us
8ab0: 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e  ed on all terms.
8ac0: 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65    The 2-bit case
8ad0: 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68   is when.  ** th
8ae0: 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  e all terms are 
8af0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62  of the form "tab
8b00: 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65  le1.column=table
8b10: 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20  2.column".  It. 
8b20: 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73   ** might be pos
8b30: 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e  sible to form an
8b40: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
8b50: 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e  h either table1.
8b60: 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74  column.  ** or t
8b70: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20  able2.column as 
8b80: 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65  the LHS if eithe
8b90: 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65  r is common to e
8ba0: 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a  very term of.  *
8bb0: 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  * the OR clause.
8bc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
8bd0: 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68  that terms of th
8be0: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f  e form "table.co
8bf0: 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75  lumn1=table.colu
8c00: 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73  mn2" (the.  ** s
8c10: 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74  ame table on bot
8c20: 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d  h sizes of the =
8c30: 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  =) cannot be opt
8c40: 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  imized..  */.  i
8c50: 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  f( chngToIN ){. 
8c60: 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54     int okToChngT
8c70: 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  oIN = 0;     /* 
8c80: 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76  True if the conv
8c90: 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20  ersion to IN is 
8ca0: 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  valid */.    int
8cb0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20   iColumn = -1;  
8cc0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
8cd0: 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66   index on lhs of
8ce0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
8cf0: 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20      int iCursor 
8d00: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8d10: 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f   Table cursor co
8d20: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d  mmon to all term
8d30: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d  s */.    int j =
8d40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8d50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8d60: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  er */..    /* Se
8d70: 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65  arch for a table
8d80: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74   and column that
8d90: 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20   appears on one 
8da0: 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
8db0: 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  ** other of the 
8dc0: 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65  == operator in e
8dd0: 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54  very subterm.  T
8de0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  hat table and co
8df0: 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  lumn.    ** will
8e00: 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20   be recorded in 
8e10: 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c  iCursor and iCol
8e20: 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68  umn.  There migh
8e30: 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20  t not be any.   
8e40: 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61   ** such table a
8e50: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20  nd column.  Set 
8e60: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20  okToChngToIN if 
8e70: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  an appropriate t
8e80: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  able.    ** and 
8e90: 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20  column is found 
8ea0: 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68  but leave okToCh
8eb0: 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20  ngToIN false if 
8ec0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  not found..    *
8ed0: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
8ee0: 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54  <2 && !okToChngT
8ef0: 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  oIN; j++){.     
8f00: 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63   pOrTerm = pOrWc
8f10: 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ->a;.      for(i
8f20: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b  =pOrWc->nTerm-1;
8f30: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
8f40: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
8f50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8f60: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
8f70: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
8f80: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
8f90: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
8fa0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
8fb0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8fc0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
8fd0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
8fe0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
8ff0: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
9000: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
9010: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
9020: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
9030: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
9040: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
9050: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
9060: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
9070: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
9080: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90a0: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
90b0: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
90c0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
90d0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
90e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
90f0: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
9100: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
9110: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
9120: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
9130: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
9140: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
9150: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
9160: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
9170: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
9180: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
9190: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
91a0: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
91b0: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
91c0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
91d0: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
91e0: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
91f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
9200: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
9210: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
9220: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
9230: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
9240: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
9250: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
9260: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
9270: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
9280: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
9290: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
92a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
92c0: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
92d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
92e0: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
92f0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
9300: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
9310: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9320: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
9340: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
9350: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
9360: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
9370: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
9380: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
9390: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
93a0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
93b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
93c0: 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e  ( (chngToIN&(chn
93d0: 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a  gToIN-1))==0 );.
93e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
93f0: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
9400: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  k(pMaskSet, iCur
9410: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
9420: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9430: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
9440: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
9450: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
9460: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
9470: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
9480: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9490: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
94a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
94b0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
94c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
94d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
94e0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
94f0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
9500: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
9510: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
9520: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
9530: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
9540: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
9550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
9560: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9570: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
9580: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9590: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
95a0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
95b0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
95c0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
95d0: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
95e0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
95f0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
9600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9610: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
9620: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
9630: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
9640: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
9650: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
9660: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
9670: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
9680: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
9690: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
96a0: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
96b0: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
96c0: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
96d0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
96e0: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
96f0: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
9700: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
9710: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
9720: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
9730: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
9740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
9750: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
9760: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9770: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
9780: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
9790: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
97a0: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
97b0: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
97c0: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
97d0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
97e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
97f0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
9800: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
9810: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
9820: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9830: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9840: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
9850: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
9860: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
9870: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
9880: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
9890: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
98a0: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
98b0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
98c0: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
98d0: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
98e0: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
98f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
9900: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
9910: 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  0.    */.    if(
9920: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
9930: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
9940: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
9950: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
9960: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
9970: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
9980: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
9990: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
99a0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
99b0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
99c0: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
99d0: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
99e0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
99f0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
9a00: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
9a10: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
9a20: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
9a30: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
9a40: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
9a50: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
9a60: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
9a70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
9a80: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9a90: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
9aa0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9ab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9ac0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9ad0: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
9ae0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9af0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
9b00: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
9b10: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9b20: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9b30: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
9b40: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
9b50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9b60: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9b70: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
9b80: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9b90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9ba0: 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c  (pWC->pParse, pL
9bb0: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
9bc0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
9bd0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9be0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9bf0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
9c00: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
9c10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9c20: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
9c30: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
9c40: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9c50: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
9c60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
9c70: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
9c80: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
9c90: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
9ca0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
9cb0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
9cc0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9cd0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
9ce0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
9cf0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
9d00: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
9d10: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
9d20: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
9d30: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
9d40: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
9d50: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
9d60: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
9d70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
9d80: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
9d90: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
9da0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9db0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9dc0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
9dd0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
9de0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
9df0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
9e00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
9e10: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9e20: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9e30: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
9e40: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
9e50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
9e60: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
9e70: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9e80: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9e90: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9ea0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9eb0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9ec0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9ed0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  /.../*.** The in
9ee0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
9ef0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
9f00: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
9f10: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
9f20: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
9f30: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
9f40: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
9f50: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
9f60: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
9f70: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
9f80: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
9f90: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
9fa0: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
9fb0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
9fc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9fd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
9fe0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
9ff0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
a000: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
a010: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
a020: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
a030: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a040: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
a050: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
a060: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
a070: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
a080: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
a090: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
a0a0: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
a0b0: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
a0c0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
a0d0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
a0e0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
a0f0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
a100: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
a110: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
a120: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
a130: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
a140: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
a150: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
a160: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
a170: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
a180: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
a190: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
a1a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
a1b0: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
a1c0: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
a1d0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
a1e0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
a1f0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
a200: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
a210: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
a220: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
a230: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
a240: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
a250: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
a260: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a270: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
a280: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
a290: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a2a0: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a2b0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
a2c0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
a2d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
a2e0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
a2f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
a300: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
a310: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a320: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a330: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
a340: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
a350: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a360: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
a370: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
a380: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
a390: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
a3a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
a3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
a3d0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
a3e0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
a3f0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a410: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
a420: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
a430: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
a440: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
a450: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a460: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
a470: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
a480: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
a490: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a4a0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
a4b0: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
a4c0: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
a4f0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
a500: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
a510: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a520: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
a530: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
a540: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
a550: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
a580: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
a590: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
a5c0: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
a5d0: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
a5e0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
a5f0: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
a600: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a610: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
a620: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a630: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a640: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a650: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
a660: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a670: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
a680: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
a690: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
a6a0: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
a6b0: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
a6c0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70  Term->pExpr;.  p
a6d0: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
a6e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a6f0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
a700: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
a710: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a720: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
a730: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
a740: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
a750: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a760: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
a770: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
a780: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a790: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
a7a0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
a7b0: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
a7c0: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
a7d0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a7e0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a7f0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
a800: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
a810: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
a820: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
a830: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
a840: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a850: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
a860: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
a870: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
a880: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a890: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
a8a0: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
a8b0: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
a8c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a8d0: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
a8e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a8f0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a900: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
a910: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
a920: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
a930: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
a940: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
a950: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
a960: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
a970: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
a980: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
a990: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
a9c0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
a9d0: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
a9e0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
a9f0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
aa00: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
aa10: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
aa20: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
aa30: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
aa40: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
aa50: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
aa60: 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e  (op) && (pTerm->
aa70: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
aa80: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a  ereqLeft)==0 ){.
aa90: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
aaa0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
aab0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
aac0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
aad0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
aae0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
aaf0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  {.      pTerm->l
ab00: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
ab10: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
ab20: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ab30: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
ab40: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65  olumn;.      pTe
ab50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
ab60: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29  operatorMask(op)
ab70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ab80: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
ab90: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
aba0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
abb0: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
abc0: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
abd0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
abe0: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
abf0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
ac00: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
ac10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ac20: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
ac30: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
ac40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ac50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ac60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
ac70: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
ac80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
ac90: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
aca0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
acb0: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
acc0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
acd0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ace0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
acf0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ad00: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
ad10: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
ad20: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
ad30: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
ad40: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
ad50: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ad60: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
ad70: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
ad80: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
ad90: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ada0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
adb0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
adc0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
add0: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
ade0: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
adf0: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
ae00: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
ae10: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
ae20: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
ae30: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
ae40: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
ae50: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
ae60: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
ae70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ae80: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
ae90: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
aea0: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
aeb0: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
aec0: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
aed0: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
aee0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
aef0: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
af00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
af10: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
af20: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
af30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
af40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
af50: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
af60: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
af70: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
af80: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
af90: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
afa0: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
afb0: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
afc0: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
afd0: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
afe0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
aff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
b000: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
b010: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
b020: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
b030: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
b040: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
b050: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
b060: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
b070: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
b080: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
b090: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
b0a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
b0b0: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
b0c0: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
b0d0: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
b0e0: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
b0f0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
b100: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
b110: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
b120: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
b130: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
b140: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
b150: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
b160: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
b170: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
b180: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
b190: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
b1a0: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
b1b0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
b1c0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b1d0: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
b1e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
b1f0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
b200: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
b210: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
b220: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
b230: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
b240: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
b250: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
b260: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b270: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
b280: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
b290: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
b2a0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b2b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
b2c0: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
b2d0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
b2e0: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
b2f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b320: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
b330: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
b360: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
b370: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
b380: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
b390: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
b3a0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
b3b0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b3c0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b3d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b3e0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
b3f0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b400: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
b410: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b420: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b430: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b440: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
b450: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
b460: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b470: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
b480: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
b490: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
b4a0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
b4b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b4c0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b4d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b4e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b4f0: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
b500: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
b510: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
b520: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
b530: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
b540: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
b550: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
b560: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b570: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
b580: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
b590: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
b5a0: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
b5b0: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
b5c0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b5d0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b5e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b5f0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b600: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
b610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b620: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
b630: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
b640: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
b650: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
b660: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
b670: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
b680: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
b690: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
b6a0: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
b6b0: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
b6c0: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
b6d0: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
b6e0: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
b6f0: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
b700: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
b710: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
b720: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
b730: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
b740: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
b750: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
b760: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
b770: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
b780: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
b790: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
b7a0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
b7b0: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
b7c0: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
b7d0: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
b7e0: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
b7f0: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
b800: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
b810: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
b820: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
b830: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
b840: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b850: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b860: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
b870: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b880: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
b890: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
b8a0: 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c 53  xNew2;.    CollS
b8b0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
b8c0: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
b8d0: 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20  nce to use */.. 
b8e0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b8f0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b900: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b910: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b920: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b930: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b940: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b950: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b960: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b970: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b980: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b990: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b9a0: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b9b0: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b9c0: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b9d0: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b9e0: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b9f0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
ba00: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
ba10: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
ba20: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
ba30: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
ba40: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
ba50: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
ba60: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
ba70: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
ba80: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
ba90: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
baa0: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
bab0: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
bac0: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
bad0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bae0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
baf0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
bb00: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
bb10: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
bb20: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
bb30: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
bb40: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
bb50: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
bb60: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
bb70: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
bb80: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
bb90: 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45  lete = 0;   /* E
bba0: 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30 37  V: R-64339-08207
bbb0: 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63 20   */...        c 
bbc0: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
bbd0: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
bbe0: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
bbf0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
bc00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
bc10: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
bc20: 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61 73  LITE_UTF8, noCas
bc30: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
bc40: 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20 20  BINARY",0);.    
bc50: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
bc60: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bc70: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
bc90: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
bca0: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
bcb0: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
bcc0: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
bcd0: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
bce0: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
bcf0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
bd00: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
bd10: 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
bd20: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
bd30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
bd40: 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
bd50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bd60: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
bd70: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
bd80: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
bd90: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
bdc0: 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78 70  tColl(sqlite3Exp
bdd0: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29  rDup(db,pLeft,0)
bde0: 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20  , pColl),.      
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
be00: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
be10: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
be20: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
be30: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
be40: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
be50: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
be60: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
be70: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
be80: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
be90: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
bea0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
beb0: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
bec0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
bed0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
bee0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
bef0: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
bf00: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
bf10: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bf20: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bf30: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
bf40: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bf50: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
bf60: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
bf70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bf80: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
bf90: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
bfa0: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
bfb0: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
bfc0: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
bfd0: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
bfe0: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
bff0: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
c000: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
c010: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
c020: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
c030: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
c040: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
c050: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
c060: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
c070: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
c080: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
c090: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
c0a0: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
c0b0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
c0c0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
c0d0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
c0e0: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
c0f0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
c100: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
c110: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
c120: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
c130: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
c140: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
c150: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
c160: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
c170: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c180: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c190: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
c1a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c1b0: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
c1c0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
c1d0: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
c1e0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c1f0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
c200: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
c210: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
c220: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c230: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
c240: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c250: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c260: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
c290: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
c2a0: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
c2b0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c2c0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c2d0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
c2e0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c2f0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
c300: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c310: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
c320: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c330: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
c340: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
c350: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
c360: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c370: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c380: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c390: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c3a0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c3b0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c3c0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c3d0: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
c3e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c3f0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c400: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c410: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c420: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c430: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c440: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c450: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c460: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c470: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c480: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c4a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c4b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c4c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c4d0: 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 2f  ENABLE_STAT2.  /
c4e0: 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
c4f0: 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at2 histogram da
c500: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
c510: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
c520: 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
c530: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
c540: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
c550: 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
c560: 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
c570: 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
c580: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
c590: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
c5a0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
c5b0: 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
c5c0: 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
c5d0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
c5e0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
c5f0: 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
c600: 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
c610: 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
c620: 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
c630: 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
c640: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
c650: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
c660: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
c670: 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
c680: 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
c690: 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
c6a0: 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
c6b0: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
c6c0: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
c6d0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
c6e0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
c6f0: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
c700: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
c710: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
c720: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
c730: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
c740: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
c750: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c760: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
c770: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c780: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
c790: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
c7a0: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
c7b0: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
c7c0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c7d0: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c800: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
c810: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c840: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c  (pParse, TK_NULL
c850: 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a  , 0, 0, 0), 0);.
c860: 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68  .    idxNew = wh
c870: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c880: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52               TER
c8b0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c8c0: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c  YNAMIC|TERM_VNUL
c8d0: 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e  L);.    if( idxN
c8e0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
c8f0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c900: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c910: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c920: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ght = 0;.      p
c930: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c940: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c950: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c960: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c970: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
c980: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
c990: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c9a0: 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65  WO_GT;.      pNe
c9b0: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
c9c0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
c9d0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c9e0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
c9f0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ca00: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
ca10: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
ca20: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
ca30: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
ca40: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
ca50: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
ca60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ca70: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f  _ENABLE_STAT2 */
ca80: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
ca90: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
caa0: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
cab0: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
cac0: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
cad0: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
cae0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
caf0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
cb00: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
cb10: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
cb20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cb30: 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66  n TRUE if any of
cb40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
cb50: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69   in pList->a[iFi
cb60: 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a  rst...] contain.
cb70: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
cb80: 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  o any table othe
cb90: 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73 65  r than the iBase
cba0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
cbb0: 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73  c int references
cbc0: 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45  OtherTables(.  E
cbd0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
cbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
cbf0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ch expressions i
cc00: 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20  n ths list */.  
cc10: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
cc20: 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70  askSet,   /* Map
cc30: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  ping from tables
cc40: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
cc50: 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
cc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
cc70: 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68 20   searching with 
cc80: 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65 78  the iFirst-th ex
cc90: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
cca0: 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20 20  t iBase         
ccb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
ccc0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
ccd0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
cce0: 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77  .  Bitmask allow
ccf0: 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  ed = ~getMask(pM
cd00: 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a  askSet, iBase);.
cd10: 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c    while( iFirst<
cd20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
cd30: 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62      if( (exprTab
cd40: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
cd50: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  , pList->a[iFirs
cd60: 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f  t++].pExpr)&allo
cd70: 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  wed)!=0 ){.     
cd80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
cd90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cda0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
cdb0: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
cdc0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
cdd0: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
cde0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
cdf0: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
ce00: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
ce10: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
ce20: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
ce30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
ce40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
ce50: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
ce60: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
ce70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
ce80: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
ce90: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
cea0: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
ceb0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
cec0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
ced0: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
cee0: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
cef0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
cf00: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
cf10: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
cf20: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
cf30: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
cf40: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
cf50: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
cf60: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
cf70: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
cf80: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
cf90: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
cfa0: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
cfb0: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
cfc0: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
cfd0: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
cfe0: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
cff0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
d000: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
d010: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
d020: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
d030: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
d040: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
d050: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
d060: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
d070: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
d080: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
d090: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
d0a0: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
d0b0: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
d0c0: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
d0d0: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
d0e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d0f0: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
d100: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
d110: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
d120: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
d130: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
d140: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
d150: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
d160: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d170: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d180: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
d190: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
d1a0: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
d1b0: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
d1c0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
d1d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
d1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d1f0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
d200: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
d210: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
d220: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
d230: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
d240: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
d250: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
d260: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
d270: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d280: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
d290: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
d2a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
d2b0: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
d2c0: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
d2d0: 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 2c  /.  int wsFlags,
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d2f0: 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61 67  ndex usages flag
d300: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
d310: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
d320: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
d330: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
d340: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d370: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
d380: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3a0: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
d3b0: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
d3c0: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
d3d0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
d400: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
d410: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d420: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
d430: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
d440: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d450: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d460: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
d470: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
d480: 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d  By!=0 );.  nTerm
d490: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
d4a0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  pr;.  assert( nT
d4b0: 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  erm>0 );..  /* A
d4c0: 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73  rgument pIdx mus
d4d0: 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74  t either point t
d4e0: 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64  o a 'real' named
d4f0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
d500: 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e  , .  ** or an in
d510: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6c  dex structure al
d520: 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
d530: 74 61 63 6b 20 62 79 20 62 65 73 74 42 74 72 65  tack by bestBtre
d540: 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a  eIndex() to.  **
d550: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
d560: 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61 74 20  owid index that 
d570: 69 73 20 70 61 72 74 20 6f 66 20 65 76 65 72 79  is part of every
d580: 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73   table.  */.  as
d590: 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d  sert( pIdx->zNam
d5a0: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
d5b0: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
d5c0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29  aiColumn[0]==-1)
d5d0: 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20   );..  /* Match 
d5e0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
d5f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61  ER BY clause aga
d600: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a  inst columns of.
d610: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a    ** the index..
d620: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
d630: 68 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65  hat indices have
d640: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72   pIdx->nColumn r
d650: 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70  egular columns p
d660: 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64  lus.  ** one add
d670: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63  itional column c
d680: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f  ontaining the ro
d690: 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  wid.  The rowid 
d6a0: 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74  column.  ** of t
d6b0: 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f  he index is also
d6c0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63   allowed to matc
d6d0: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52  h against the OR
d6e0: 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75  DER BY.  ** clau
d6f0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  se..  */.  for(i
d700: 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64  =j=0, pTerm=pOrd
d710: 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d  erBy->a; j<nTerm
d720: 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f   && i<=pIdx->nCo
d730: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d740: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
d750: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
d760: 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45  sion of the ORDE
d770: 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20  R BY pTerm */.  
d780: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
d790: 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  ;    /* The coll
d7a0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
d7b0: 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69  f pExpr */.    i
d7c0: 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  nt termSortOrder
d7d0: 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20  ; /* Sort order 
d7e0: 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
d7f0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
d800: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
d810: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  -th column of th
d820: 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72  e index.  -1 for
d830: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e   rowid */.    in
d840: 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20  t iSortOrder;   
d850: 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20   /* 1 for DESC, 
d860: 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65  0 for ASC on the
d870: 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d   i-th index term
d880: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
d890: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61  ar *zColl; /* Na
d8a0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  me of the collat
d8b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
d8c0: 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d   i-th index term
d8d0: 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d   */..    pExpr =
d8e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
d8f0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
d900: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
d910: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61  Expr->iTable!=ba
d920: 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  se ){.      /* C
d930: 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  an not use an in
d940: 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74  dex sort on anyt
d950: 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  hing that is not
d960: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
d970: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d  .      ** left-m
d980: 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ost table of the
d990: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
d9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9b0: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
d9c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d9d0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
d9e0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
d9f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
da00: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
da10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
da20: 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c  Idx->zName && i<
da30: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
da40: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
da50: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
da60: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  i];.      if( iC
da70: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
da80: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  ble->iPKey ){.  
da90: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
daa0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
dab0: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    iSortOrder = p
dac0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
dad0: 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  i];.      zColl 
dae0: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
daf0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
db00: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
db10: 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  ;.      iSortOrd
db20: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43  er = 0;.      zC
db30: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll = pColl->zNa
db40: 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  me;.    }.    if
db50: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
db60: 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c  !=iColumn || sql
db70: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
db80: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
db90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72   ){.      /* Ter
dba0: 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52  m j of the ORDER
dbb0: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
dbc0: 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e  not match column
dbd0: 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20   i of the index 
dbe0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  */.      if( i<n
dbf0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  EqCol ){.       
dc00: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
dc10: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63  column that is c
dc20: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
dc30: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
dc40: 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  an.        ** OR
dc50: 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61  DER BY term, tha
dc60: 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69  t is OK.  Just i
dc70: 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  gnore that colum
dc80: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  n of the index. 
dc90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dca0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
dcb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70    }else if( i==p
dcc0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
dcd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
dce0: 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65   column i is the
dcf0: 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68   rowid.  All oth
dd00: 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20  er terms match. 
dd10: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
dd20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dd30: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
dd40: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69  index column fai
dd50: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20  ls to match and 
dd60: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  is not constrain
dd70: 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20  ed by ==.       
dd80: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64   ** then the ind
dd90: 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  ex cannot satisf
dda0: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
ddb0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20  onstraint..     
ddc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
ddd0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
dde0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
ddf0: 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
de00: 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e  er!=0 || iColumn
de10: 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ==-1 );.    asse
de20: 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  rt( pTerm->sortO
de30: 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d  rder==0 || pTerm
de40: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
de50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
de60: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
de70: 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
de80: 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
de90: 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
dea0: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
deb0: 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71  r;.    if( i>nEq
dec0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
ded0: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
dee0: 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
def0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20       /* Indices 
df00: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
df10: 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   if all ORDER BY
df20: 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a   terms past the.
df30: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c          ** equal
df40: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
df50: 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44  are all either D
df60: 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20  ESC or ASC. */. 
df70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
df80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
df90: 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72  se{.      sortOr
dfa0: 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72  der = termSortOr
dfb0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  der;.    }.    j
dfc0: 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b  ++;.    pTerm++;
dfd0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
dfe0: 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63 65  <0 && !reference
dff0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
e000: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
e010: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
e020: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
e030: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74  exed column is t
e040: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61  he primary key a
e050: 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61  nd everything ma
e060: 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73  tches.      ** s
e070: 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f  o far and none o
e080: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
e090: 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68  erms to the righ
e0a0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  t reference othe
e0b0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  r.      ** table
e0c0: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74  s in the join, t
e0d0: 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75 72  hen we are assur
e0e0: 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ed that the inde
e0f0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20  x can be used . 
e100: 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20       ** to sort 
e110: 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69 6d  because the prim
e120: 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75  ary key is uniqu
e130: 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66  e and so none of
e140: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20   the other.     
e150: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c   ** columns will
e160: 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72   make any differ
e170: 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ence.      */.  
e180: 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20      j = nTerm;. 
e190: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52     }.  }..  *pbR
e1a0: 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d  ev = sortOrder!=
e1b0: 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  0;.  if( j>=nTer
e1c0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  m ){.    /* All 
e1d0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
e1e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
e1f0: 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69 73   covered by this
e200: 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a   index so.    **
e210: 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20   this index can 
e220: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
e230: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ing. */.    retu
e240: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
e250: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
e260: 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64  E_None && i==pId
e270: 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  x->nColumn.     
e280: 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57   && (wsFlags & W
e290: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
e2a0: 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 21 72  )==0.      && !r
e2b0: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
e2c0: 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70  bles(pOrderBy, p
e2d0: 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65  MaskSet, j, base
e2e0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  ) ){.    /* All 
e2f0: 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e  terms of this in
e300: 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70  dex match some p
e310: 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44  refix of the ORD
e320: 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ER BY clause.   
e330: 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65   ** and the inde
e340: 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20  x is UNIQUE and 
e350: 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  no terms on the 
e360: 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45  tail of the ORDE
e370: 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
e380: 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68  se reference oth
e390: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  er tables in a j
e3a0: 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73  oin.  If this is
e3b0: 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20   all true then. 
e3c0: 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20     ** the order 
e3d0: 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70  by clause is sup
e3e0: 65 72 66 6c 75 6f 75 73 2e 20 20 4e 6f 74 20 74  erfluous.  Not t
e3f0: 68 61 74 20 69 66 20 74 68 65 20 6d 61 74 63 68  hat if the match
e400: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  ing.    ** condi
e410: 74 69 6f 6e 20 69 73 20 49 53 20 4e 55 4c 4c 20  tion is IS NULL 
e420: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
e430: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
e440: 6c 79 20 75 6e 69 71 75 65 0a 20 20 20 20 2a 2a  ly unique.    **
e450: 20 65 76 65 6e 20 6f 6e 20 61 20 55 4e 49 51 55   even on a UNIQU
e460: 45 20 69 6e 64 65 78 2c 20 73 6f 20 64 69 73 61  E index, so disa
e470: 6c 6c 6f 77 20 74 68 6f 73 65 20 63 61 73 65 73  llow those cases
e480: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
e490: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
e4a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  0;.}../*.** Prep
e4b0: 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69  are a crude esti
e4c0: 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61  mate of the loga
e4d0: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
e4e0: 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  ut value..** The
e4f0: 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f   results need no
e500: 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69  t be exact.  Thi
e510: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
e520: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a  or estimating.**
e530: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20   the total cost 
e540: 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70  of performing op
e550: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28  erations with O(
e560: 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e  logN) or O(NlogN
e570: 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e  ).** complexity.
e580: 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a    Because N is j
e590: 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20  ust a guess, it 
e5a0: 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67  is no great trag
e5b0: 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69  edy if.** logN i
e5c0: 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a  s a little off..
e5d0: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
e5e0: 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e   estLog(double N
e5f0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  ){.  double logN
e600: 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78   = 1;.  double x
e610: 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20   = 10;.  while( 
e620: 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20  N>x ){.    logN 
e630: 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31  += 1;.    x *= 1
e640: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
e650: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  logN;.}../*.** T
e660: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
e670: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
e680: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
e690: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
e6a0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
e6b0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
e6c0: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
e6d0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
e6e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
e6f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
e700: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
e710: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
e720: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
e730: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e740: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
e750: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
e760: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
e770: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
e780: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
e790: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e7a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e7b0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e7c0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e7d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e7e0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e7f0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e800: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
e810: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
e820: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
e830: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
e840: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e850: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e860: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
e870: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
e880: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
e890: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
e8a0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
e8b0: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
e8c0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
e8d0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
e8e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
e8f0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
e900: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e910: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
e920: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
e930: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
e940: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e950: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e960: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
e970: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
e980: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
e990: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
e9a0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e9b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e9c0: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e9d0: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e9e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e9f0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
ea00: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
ea10: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
ea20: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
ea30: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
ea40: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
ea50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
ea60: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
ea70: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
ea80: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
ea90: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
eaa0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
eab0: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
eac0: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
ead0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
eae0: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
eaf0: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
eb00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
eb10: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
eb20: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
eb30: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
eb40: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
eb50: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
eb60: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
eb70: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
eb80: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
eb90: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
eba0: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
ebb0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
ebc0: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  S(A).#endif../* 
ebd0: 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65 63  .** Required bec
ebe0: 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28 29  ause bestIndex()
ebf0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65   is called by be
ec00: 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
ec10: 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ) .*/.static voi
ec20: 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 20  d bestIndex(.   
ec30: 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43 6c   Parse*, WhereCl
ec40: 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53 72  ause*, struct Sr
ec50: 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a 20 20 20  cList_item*,.   
ec60: 20 42 69 74 6d 61 73 6b 2c 20 42 69 74 6d 61 73   Bitmask, Bitmas
ec70: 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68  k, ExprList*, Wh
ec80: 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a  ereCost*);../*.*
ec90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
eca0: 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
ecb0: 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61  an scanning stra
ecc0: 74 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65  tegy that can be
ecd0: 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74   used .** to opt
ece0: 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78  imize an 'OR' ex
ecf0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
ed00: 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45   part of a WHERE
ed10: 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20   clause. .**.** 
ed20: 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  The table associ
ed30: 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63  ated with FROM c
ed40: 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20  lause term pSrc 
ed50: 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a  may be either a.
ed60: 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65  ** regular B-Tre
ed70: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72  e table or a vir
ed80: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
ed90: 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f  tatic void bestO
eda0: 72 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20  rClauseIndex(.  
edb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
edd0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
ede0: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
edf0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
ee00: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
ee10: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
ee20: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ee30: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
ee40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
ee50: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
ee60: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
ee70: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
ee80: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
ee90: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
eea0: 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
eeb0: 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c  itmask notValid,
eec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
eed0: 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
eee0: 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ble for any purp
eef0: 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ose */.  ExprLis
ef00: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
ef10: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
ef20: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
ef30: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
ef40: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
ef50: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
ef60: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66  y plan */.){.#if
ef70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ef80: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
ef90: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75  .  const int iCu
efa0: 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
efb0: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
efc0: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
efd0: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
efe0: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
eff0: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
f000: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
f010: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
f020: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
f030: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
f040: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
f050: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
f060: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
f070: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
f080: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f090: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
f0a0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
f0b0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
f0c0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
f0d0: 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75 73 65 20  /* No OR-clause 
f0e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c  optimization all
f0f0: 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44 45  owed if the INDE
f100: 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
f110: 44 45 58 45 44 20 63 6c 61 75 73 65 73 0a 20 20  DEXED clauses.  
f120: 2a 2a 20 61 72 65 20 75 73 65 64 20 2a 2f 0a 20  ** are used */. 
f130: 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
f140: 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70  dexed || pSrc->p
f150: 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
f160: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
f170: 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45  * Search the WHE
f180: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
f190: 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f  for a usable WO_
f1a0: 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  OR term. */.  fo
f1b0: 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
f1c0: 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
f1d0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
f1e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f1f0: 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26  ==WO_OR .     &&
f200: 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   ((pTerm->prereq
f210: 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20  All & ~maskSrc) 
f220: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
f230: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
f240: 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
f250: 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d  ble & maskSrc)!=
f260: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
f270: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
f280: 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
f290: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
f2a0: 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
f2b0: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
f2c0: 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
f2d0: 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
f2e0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
f2f0: 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
f300: 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45  nt flags = WHERE
f310: 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20  _MULTI_OR;.     
f320: 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d   double rTotal =
f330: 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   0;.      double
f340: 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20   nRow = 0;.     
f350: 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20   Bitmask used = 
f360: 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f  0;..      for(pO
f370: 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20  rTerm=pOrWC->a; 
f380: 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64  pOrTerm<pOrWCEnd
f390: 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  ; pOrTerm++){.  
f3a0: 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
f3b0: 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20  sTermCost;.     
f3c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
f3d0: 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20  ... Multi-index 
f3e0: 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74  OR testing for t
f3f0: 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e  erm %d of %d....
f400: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
f410: 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43  (pOrTerm - pOrWC
f420: 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70  ->a), (pTerm - p
f430: 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29  WC->a).        )
f440: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f450: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
f460: 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
f470: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
f480: 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f  se *pAndWC = &pO
f490: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
f4a0: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20  o->wc;.         
f4b0: 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
f4c0: 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c  e, pAndWC, pSrc,
f4d0: 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
f4e0: 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f  lid, 0, &sTermCo
f4f0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  st);.        }el
f500: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
f510: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
f520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
f530: 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43  ereClause tempWC
f540: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
f550: 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d  WC.pParse = pWC-
f560: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
f570: 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53     tempWC.pMaskS
f580: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
f590: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  et;.          te
f5a0: 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
f5b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
f5c0: 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
f5d0: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
f5e0: 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  .nTerm = 1;.    
f5f0: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
f600: 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c  pParse, &tempWC,
f610: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
f620: 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73   notValid, 0, &s
f630: 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
f640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f650: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
f660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f670: 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43  rTotal += sTermC
f680: 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  ost.rCost;.     
f690: 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d     nRow += sTerm
f6a0: 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  Cost.plan.nRow;.
f6b0: 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
f6c0: 73 54 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a  sTermCost.used;.
f6d0: 20 20 20 20 20 20 20 20 69 66 28 20 72 54 6f 74          if( rTot
f6e0: 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74  al>=pCost->rCost
f6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f700: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
f710: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
f720: 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72   BY clause, incr
f730: 65 61 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f  ease the scan co
f740: 73 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20  st to account . 
f750: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
f760: 63 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74  cost of the sort
f770: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
f780: 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20  OrderBy!=0 ){.  
f790: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
f7a0: 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69  (("... sorting i
f7b0: 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74  ncreases OR cost
f7c0: 20 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22   %.9g to %.9g\n"
f7d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f7e0: 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54        rTotal, rT
f7f0: 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67  otal+nRow*estLog
f800: 28 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20  (nRow)));.      
f810: 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77    rTotal += nRow
f820: 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20  *estLog(nRow);. 
f830: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
f840: 20 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20   If the cost of 
f850: 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74  scanning using t
f860: 68 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20  his OR term for 
f870: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a  optimization is.
f880: 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68        ** less th
f890: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  an the current c
f8a0: 6f 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43  ost stored in pC
f8b0: 6f 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65  ost, replace the
f8c0: 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20   contents.      
f8d0: 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a  ** of pCost. */.
f8e0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
f8f0: 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64  (("... multi-ind
f900: 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20  ex OR cost=%.9g 
f910: 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54  nrow=%.9g\n", rT
f920: 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20  otal, nRow));.  
f930: 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70      if( rTotal<p
f940: 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20  Cost->rCost ){. 
f950: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
f960: 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20  ost = rTotal;.  
f970: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
f980: 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20  d = used;.      
f990: 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52    pCost->plan.nR
f9a0: 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  ow = nRow;.     
f9b0: 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
f9c0: 73 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  sFlags = flags;.
f9d0: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f9e0: 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54  lan.u.pTerm = pT
f9f0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
fa00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
fa10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
fa20: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
fa30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fa40: 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
fa50: 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74  _INDEX./*.** Ret
fa60: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
fa70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fa80: 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20  m pTerm is of a 
fa90: 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a  form where it.**
faa0: 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77   could be used w
fab0: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ith an index to 
fac0: 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73  access pSrc, ass
fad0: 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72  uming an appropr
fae0: 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78  iate.** index ex
faf0: 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  isted..*/.static
fb00: 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76   int termCanDriv
fb10: 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54  eIndex(.  WhereT
fb20: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
fb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
fb40: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  E clause term to
fb50: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75   check */.  stru
fb60: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
fb70: 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61  *pSrc,     /* Ta
fb80: 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e  ble we are tryin
fb90: 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  g to access */. 
fba0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
fbb0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
fbc0: 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74  /* Tables in out
fbd0: 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20  er loops of the 
fbe0: 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  join */.){.  cha
fbf0: 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65  r aff;.  if( pTe
fc00: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
fc10: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
fc20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fc30: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fc40: 21 3d 57 4f 5f 45 51 20 29 20 72 65 74 75 72 6e  !=WO_EQ ) return
fc50: 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d   0;.  if( (pTerm
fc60: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
fc70: 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72  notReady)!=0 ) r
fc80: 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
fc90: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
fca0: 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
fcb0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
fcc0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
fcd0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
fce0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
fcf0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
fd00: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
fd10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
fd20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
fd30: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66  C_INDEX./*.** If
fd40: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
fd50: 66 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69  for pSrc specifi
fd60: 65 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61  ed in pCost is a
fd70: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
fd80: 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67  .** and indexing
fd90: 20 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74   is allows (if t
fda0: 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49  here is no NOT I
fdb0: 4e 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61  NDEXED clause) a
fdc0: 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c  nd it.** possibl
fdd0: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  e to construct a
fde0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
fdf0: 20 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66   that would perf
fe00: 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68  orm better.** th
fe10: 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
fe20: 73 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74  scan even when t
fe30: 68 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74  he cost of const
fe40: 72 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65  ructing the inde
fe50: 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e  x.** is taken in
fe60: 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e  to account, then
fe70: 20 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79   alter the query
fe80: 20 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65   plan to use the
fe90: 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  .** transient in
fea0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
feb0: 6f 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69  oid bestAutomati
fec0: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
fed0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
fee0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
fef0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ff00: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
ff10: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
ff20: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
ff30: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
ff40: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
ff50: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
ff60: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
ff70: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
ff80: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
ff90: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
ffa0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
ffb0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
ffc0: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
ffd0: 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
ffe0: 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
fff0: 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
10000 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65  .  double nTable
10010 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Row;           /
10020 2a 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * Rows in the in
10030 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64  put table */.  d
10040 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20  ouble logN;     
10050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
10060 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a  g(nTableRow) */.
10070 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d    double costTem
10080 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
10090 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20   per-query cost 
100a0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  of the transient
100b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
100c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
100d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
100e0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
100f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10100 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
10110 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
10120 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
10130 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10140 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
10150 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d    /* Table tht m
10160 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20  ight be indexed 
10170 2a 2f 0a 0a 20 20 69 66 28 20 28 70 50 61 72 73  */..  if( (pPars
10180 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
10190 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
101a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75  ==0 ){.    /* Au
101b0 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20  tomatic indices 
101c0 61 72 65 20 64 69 73 61 62 6c 65 64 20 61 74 20  are disabled at 
101d0 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20  run-time */.    
101e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
101f0 28 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  ( (pCost->plan.w
10200 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
10210 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20  OT_FULLSCAN)!=0 
10220 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72  ){.    /* We alr
10230 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b  eady have some k
10240 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20  ind of index in 
10250 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  use for this que
10260 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ry. */.    retur
10270 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  n;.  }.  if( pSr
10280 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b  c->notIndexed ){
10290 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20  .    /* The NOT 
102a0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61  INDEXED clause a
102b0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51  ppears in the SQ
102c0 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  L. */.    return
102d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
102e0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
102f0 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31  oop >= (double)1
10300 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   );.  pTable = p
10310 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61  Src->pTab;.  nTa
10320 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d  bleRow = pTable-
10330 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e  >nRowEst;.  logN
10340 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65   = estLog(nTable
10350 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70  Row);.  costTemp
10360 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54  Idx = 2*logN*(nT
10370 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e  ableRow/pParse->
10380 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b  nQueryLoop + 1);
10390 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49  .  if( costTempI
103a0 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74  dx>=pCost->rCost
103b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63   ){.    /* The c
103c0 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20  ost of creating 
103d0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
103e0 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65  ble would be gre
103f0 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ater than.    **
10400 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20   doing the full 
10410 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  table scan */.  
10420 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10430 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
10440 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70  ny equality comp
10450 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20  arison term */. 
10460 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
10470 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
10480 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
10490 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
104a0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
104b0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
104c0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
104d0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
104e0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
104f0 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64  ("auto-index red
10500 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25  uces cost from %
10510 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a  .1f to %.1f\n",.
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
10540 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b  , costTempIdx));
10550 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
10560 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64  ost = costTempId
10570 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  x;.      pCost->
10580 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e  plan.nRow = logN
10590 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f 73   + 1;.      pCos
105a0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
105b0 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  = WHERE_TEMP_IND
105c0 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  EX;.      pCost-
105d0 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70  >used = pTerm->p
105e0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
105f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10600 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
10610 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69  ine bestAutomati
10620 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45  cIndex(A,B,C,D,E
10630 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23  )  /* no-op */.#
10640 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10650 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
10660 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  NDEX */...#ifnde
10670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10680 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
10690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
106a0 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
106b0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
106c0 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
106d0 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
106e0 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
106f0 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
10700 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
10710 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
10720 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
10730 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
10740 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
10750 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
10760 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
10770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10790 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
107a0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
107b0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
107c0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
107d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
107e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
107f0 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
10800 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
10810 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
10820 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
10830 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
10840 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
10850 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
10860 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
10870 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
10880 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
10890 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
108a0 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
108b0 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
108e0 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
108f0 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
10900 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
10910 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
10920 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
10930 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10940 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
10950 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
10960 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
10970 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
10980 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
10990 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
109a0 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
109b0 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
109c0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
109d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
109e0 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
109f0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
10a00 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
10a30 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
10a40 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10a50 20 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74 3b    int regIsInit;
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 52 65 67 69 73 74 65 72 20 73 65 74 20 62 79   Register set by
10a80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
10a90 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
10aa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10ab0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10ac0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
10ad0 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
10ae0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
10af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10b00 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
10b10 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b  g indexed */.  K
10b20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f  eyInfo *pKeyinfo
10b30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65  ;          /* Ke
10b40 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
10b50 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20  r the index */  
10b60 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b   .  int addrTop;
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
10b90 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
10ba0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
10bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10bc0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
10bd0 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
10be0 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
10c10 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
10c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10c40 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
10c50 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
10c60 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
10c70 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
10c80 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
10c90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10cb0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10cc0 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
10cd0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
10ce0 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
10cf0 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
10d00 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
10d10 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
10d20 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
10d40 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
10d50 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  l columns */..  
10d60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10d70 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
10d80 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
10d90 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
10da0 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
10db0 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
10dc0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
10dd0 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
10de0 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
10df0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10e00 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10e10 3b 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d 20  ;.  regIsInit = 
10e20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10e30 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
10e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10e50 2c 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49 6e  , OP_If, regIsIn
10e60 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  it);.  sqlite3Vd
10e70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10e80 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49 73  nteger, 1, regIs
10e90 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  Init);..  /* Cou
10ea0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
10eb0 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
10ec0 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
10ed0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
10ee0 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
10ef0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
10f00 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43  straints */.  nC
10f10 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61  olumn = 0;.  pTa
10f20 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
10f30 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
10f40 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
10f50 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
10f60 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
10f70 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
10f80 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
10f90 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
10fa0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
10fb0 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
10fc0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10fd0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
10fe0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
10ff0 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
11000 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
11010 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
11020 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
11030 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
11040 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
11050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11060 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
11070 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
11080 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
11090 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  ){.        nColu
110a0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64  mn++;.        id
110b0 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
110c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
110d0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
110e0 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65  umn>0 );.  pLeve
110f0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43  l->plan.nEq = nC
11100 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75  olumn;..  /* Cou
11110 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
11120 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
11130 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72  mns needed to cr
11140 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65  eate a.  ** cove
11150 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22  ring index.  A "
11160 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20  covering index" 
11170 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
11180 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20   contains all.  
11190 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
111a0 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
111b0 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61  e query.  With a
111c0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c   covering index,
111d0 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
111e0 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e  al table never n
111f0 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73  eeds to be acces
11200 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20  sed.  Automatic 
11210 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a  indices must.  *
11220 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20  * be a covering 
11230 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68  index because th
11240 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74  e index will not
11250 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74   be updated if t
11260 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  he.  ** original
11270 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61   table changes a
11280 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  nd the index and
11290 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f   table cannot bo
112a0 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20  th be used.  ** 
112b0 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f  if they go out o
112c0 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65  f sync..  */.  e
112d0 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d  xtraCols = pSrc-
112e0 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78  >colUsed & (~idx
112f0 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73  Cols | (((Bitmas
11300 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b  k)1)<<(BMS-1)));
11310 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
11320 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
11330 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
11340 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
11350 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
11360 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
11370 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
11380 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
11390 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
113a0 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
113b0 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
113c0 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
113d0 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e  1)<<i) ) nColumn
113e0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
113f0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
11400 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
11410 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f  S-1)) ){.    nCo
11420 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
11430 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
11440 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c    }.  pLevel->pl
11450 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
11460 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
11470 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
11480 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f   WO_EQ;..  /* Co
11490 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65  nstruct the Inde
114a0 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63  x object to desc
114b0 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20  ribe this index 
114c0 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  */.  nByte = siz
114d0 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42  eof(Index);.  nB
114e0 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73  yte += nColumn*s
114f0 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20  izeof(int);     
11500 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
11510 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20  n */.  nByte += 
11520 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63  nColumn*sizeof(c
11530 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65  har*);   /* Inde
11540 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42  x.azColl */.  nB
11550 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20  yte += nColumn; 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
11580 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20  der */.  pIdx = 
11590 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
115a0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
115b0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49  nByte);.  if( pI
115c0 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
115d0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75    pLevel->plan.u
115e0 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
115f0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
11600 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b  char**)&pIdx[1];
11610 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
11620 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d  n = (int*)&pIdx-
11630 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d  >azColl[nColumn]
11640 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
11650 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64  rder = (u8*)&pId
11660 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
11670 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e  umn];.  pIdx->zN
11680 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65  ame = "auto-inde
11690 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  x";.  pIdx->nCol
116a0 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  umn = nColumn;. 
116b0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
116c0 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
116d0 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
116e0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
116f0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
11700 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
11710 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
11720 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
11730 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
11740 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
11750 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
11760 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
11770 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
11780 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
11790 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
117a0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
117b0 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  ol;.      if( (i
117c0 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
117d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
117e0 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
117f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
11800 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
11810 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
11820 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
11830 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
11840 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
11850 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
11860 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
11870 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
11880 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
11890 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
118a0 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
118b0 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
118c0 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
118d0 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
118e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
118f0 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
11900 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  ==pLevel->plan.n
11910 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  Eq );..  /* Add 
11920 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
11930 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ns needed to mak
11940 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
11950 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20  index into.  ** 
11960 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
11970 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11980 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
11990 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
119a0 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ls & (((Bitmask)
119b0 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20  1)<<i) ){.      
119c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
119d0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
119e0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
119f0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
11a00 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
11a10 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  if( pSrc->colUse
11a20 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  d & (((Bitmask)1
11a30 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20  )<<(BMS-1)) ){. 
11a40 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20     for(i=BMS-1; 
11a50 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
11a60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i++){.      pIdx
11a70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
11a80 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
11a90 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
11aa0 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
11ab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
11ac0 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  rt( n==nColumn )
11ad0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
11ae0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
11af0 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f  ex */.  pKeyinfo
11b00 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
11b10 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
11b20 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Idx);.  assert( 
11b30 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
11b40 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
11b50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11b60 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70  OpenAutoindex, p
11b70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
11b80 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20  nColumn+1, 0,.  
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
11bb0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
11bc0 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
11bd0 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25  mment((v, "for %
11be0 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
11bf0 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  e));..  /* Fill 
11c00 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
11c10 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74  dex with content
11c20 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
11c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c40 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
11c50 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
11c60 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
11c70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11c80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11c90 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
11ca0 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
11cb0 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
11cc0 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ur, regRecord, 1
11cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11ce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
11cf0 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e  Insert, pLevel->
11d00 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f  iIdxCur, regReco
11d10 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
11d20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
11d30 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
11d40 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  LT);.  sqlite3Vd
11d50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
11d60 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ext, pLevel->iTa
11d70 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29  bCur, addrTop+1)
11d80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
11d90 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
11da0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
11db0 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
11dc0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11dd0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
11de0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11df0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
11e00 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  ecord);.  .  /* 
11e10 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73  Jump here when s
11e20 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
11e30 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
11e40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11e50 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29  ere(v, addrInit)
11e60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11e70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
11e80 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
11e90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ea0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
11eb0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
11ec0 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
11ed0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11ee0 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
11ef0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
11f00 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
11f10 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
11f20 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
11f30 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
11f40 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
11f50 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
11f60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
11f70 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
11f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
11f90 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
11fa0 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
11fb0 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
11fc0 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61 75  se, .  WhereClau
11fd0 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63  se *pWC,.  struc
11fe0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11ff0 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74  pSrc,.  ExprList
12000 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20   *pOrderBy.){.  
12010 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
12020 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20  nTerm;.  struct 
12030 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12040 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
12050 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
12060 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
12070 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b  by *pIdxOrderBy;
12080 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
12090 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
120a0 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
120b0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
120c0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  Term;.  int nOrd
120d0 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erBy;.  sqlite3_
120e0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
120f0 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52  Info;..  WHERETR
12100 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e  ACE(("Recomputin
12110 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72  g index info for
12120 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d   %s...\n", pSrc-
12130 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
12140 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
12150 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62  number of possib
12160 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
12170 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65  constraints refe
12180 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  rring.  ** to th
12190 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
121a0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72   */.  for(i=nTer
121b0 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
121c0 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
121d0 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
121e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
121f0 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
12200 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
12210 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
12220 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  t( (pTerm->eOper
12230 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
12240 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
12250 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
12260 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
12270 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65  =WO_IN );.    te
12280 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
12290 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
122a0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
122b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
122c0 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
122d0 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
122e0 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d      nTerm++;.  }
122f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52  ..  /* If the OR
12300 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
12310 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75  ntains only colu
12320 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  mns in the curre
12330 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  nt .  ** virtual
12340 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
12350 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
12360 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
12370 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
12380 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12390 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a  structure..  */.
123a0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
123b0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
123c0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
123d0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
123e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
123f0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
12400 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
12410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
12420 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
12430 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
12440 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
12450 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
12460 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
12470 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
12480 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
12490 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
124a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
124b0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
124c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
124d0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
124e0 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
124f0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
12500 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
12510 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
12540 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
12550 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
12560 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
12590 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
125a0 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
125b0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
125c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
125d0 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
125e0 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28  mory");.    /* (
125f0 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65  double)0 In case
12600 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
12610 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e  FLOATING_POINT..
12620 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
12630 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  0;.  }..  /* Ini
12640 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75  tialize the stru
12650 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69  cture.  The sqli
12660 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12670 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
12680 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c  s.  ** many fiel
12690 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c  ds that are decl
126a0 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20  ared "const" to 
126b0 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64  prevent xBestInd
126c0 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61  ex from.  ** cha
126d0 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
126e0 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
126f0 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
12700 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69   order to.  ** i
12710 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
12720 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70  fields..  */.  p
12730 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
12740 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
12750 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
12760 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78  xInfo[1];.  pIdx
12770 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63  OrderBy = (struc
12780 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
12790 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f  orderby*)&pIdxCo
127a0 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73  ns[nTerm];.  pUs
127b0 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71  age = (struct sq
127c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
127d0 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70  traint_usage*)&p
127e0 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65  IdxOrderBy[nOrde
127f0 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  rBy];.  *(int*)&
12800 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
12810 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20  raint = nTerm;. 
12820 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
12830 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
12840 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
12850 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12860 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
12870 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12880 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
12890 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
128a0 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
128b0 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
128c0 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
128d0 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
128e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
128f0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
12900 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
12910 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
12920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66      pUsage;..  f
12970 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
12980 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
12990 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
129a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
129b0 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
129c0 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
129d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
129e0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
129f0 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
12a00 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
12a10 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
12a20 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
12a30 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
12a40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
12a50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
12a60 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
12a70 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
12a80 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
12a90 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
12aa0 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
12ab0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
12ac0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12ad0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
12ae0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
12af0 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  = i;.    pIdxCon
12b00 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54  s[j].op = (u8)pT
12b10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a  erm->eOperator;.
12b20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
12b30 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
12b40 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
12b50 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
12b60 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
12b70 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
12b80 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12b90 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
12ba0 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
12bb0 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
12bc0 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
12bd0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
12be0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
12bf0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
12c00 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
12c10 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
12c20 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
12c30 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
12c40 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
12c50 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
12c60 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
12c70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
12c80 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
12c90 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
12ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
12cb0 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
12cc0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
12cd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12ce0 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
12cf0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12d00 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
12d10 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
12d20 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
12d30 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
12d40 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43  GT|WO_GE|WO_MATC
12d50 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20  H) );.    j++;. 
12d60 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
12d70 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
12d80 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
12d90 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
12da0 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78  .pExpr;.    pIdx
12db0 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
12dc0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
12dd0 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  umn;.    pIdxOrd
12de0 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
12df0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
12e00 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
12e10 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b  return pIdxInfo;
12e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61  .}../*.** The ta
12e30 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72  ble object refer
12e40 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74  ence passed as t
12e50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12e60 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12e70 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72  ion.** must repr
12e80 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20  esent a virtual 
12e90 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
12ea0 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  tion invokes the
12eb0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a   xBestIndex().**
12ec0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
12ed0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74  irtual table wit
12ee0 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  h the sqlite3_in
12ef0 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72  dex_info pointer
12f00 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
12f10 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  e argument..**.*
12f20 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12f30 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20  curs, pParse is 
12f40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
12f50 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12f60 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  and a.** non-zer
12f70 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  o value is retur
12f80 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
12f90 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  0 is returned an
12fa0 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
12fb0 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69  part of the sqli
12fc0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12fd0 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74  tructure is left
12fe0 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a   populated..**.*
12ff0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
13000 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
13010 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65  urned, it is the
13020 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13030 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
13040 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
13050 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66  ree p->idxStr if
13060 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
13070 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a  xStr indicates.*
13080 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72  * that this is r
13090 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
130a0 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49  ic int vtabBestI
130b0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
130c0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
130d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
130e0 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  nfo *p){.  sqlit
130f0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
13100 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
13110 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
13120 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e  ab)->pVtab;.  in
13130 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
13140 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
13150 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
13160 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
13170 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
13180 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
13190 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
131a0 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
131b0 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
131c0 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
131d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
131e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
131f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
13200 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
13210 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13220 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
13230 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
13240 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
13250 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13260 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
13270 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
13280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13290 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
132a0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
132b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
132c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
132d0 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
132e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
132f0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
13300 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
13310 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
13320 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
13330 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
13340 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
13350 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
13360 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
13370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13380 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
13390 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
133a0 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
133b0 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
133c0 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
133d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
133e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
133f0 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a  se->nErr;.}.../*
13400 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
13410 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
13420 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
13430 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
13440 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
13450 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
13460 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
13470 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
13480 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
13490 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
134a0 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
134b0 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
134c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
134d0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
134e0 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
134f0 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
13500 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
13510 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
13520 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
13530 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
13540 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
13550 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
13560 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
13570 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
13580 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
13590 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
135a0 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
135b0 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
135c0 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
135d0 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
135e0 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
135f0 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
13600 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13610 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
13620 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
13630 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
13640 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
13650 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
13660 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
13670 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
13680 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
13690 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
136a0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
136b0 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
136c0 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
136d0 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
136e0 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56  tatic void bestV
136f0 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50  irtualIndex(.  P
13700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13720 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
13730 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
13740 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
13750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13760 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
13770 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13780 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
13790 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
137a0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
137b0 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
137c0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
137d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
137e0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
137f0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
13800 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
13810 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20  sk notValid,    
13820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
13830 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64 20  rsors not valid 
13840 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20  for any purpose 
13850 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13860 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
13870 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
13880 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
13890 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
138a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
138b0 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
138c0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
138d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
138e0 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20  fo **ppIdxInfo  
138f0 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
13900 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
13910 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a  BestIndex */.){.
13920 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13930 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
13940 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13950 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
13960 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13970 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
13980 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
13990 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
139a0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
139b0 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
139c0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
139d0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
139e0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75 62  nOrderBy;.  doub
139f0 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20  le rCost;..  /* 
13a00 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67  Make sure wsFlag
13a10 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  s is initialized
13a20 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61   to some sane va
13a30 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lue. Otherwise, 
13a40 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c  if the .  ** mal
13a50 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49  loc in allocateI
13a60 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73  ndexInfo() fails
13a70 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13a80 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69  on returns leavi
13a90 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20  ng.  ** wsFlags 
13aa0 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  in an uninitiali
13ab0 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63  zed state, the c
13ac0 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65  aller may behave
13ad0 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a   unpredictably..
13ae0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43    */.  memset(pC
13af0 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
13b00 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74  pCost));.  pCost
13b10 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
13b20 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
13b30 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  BLE;..  /* If th
13b40 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13b50 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  info structure h
13b60 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
13b70 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  iously.  ** allo
13b80 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  cated and initia
13b90 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f  lized, then allo
13ba0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
13bb0 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ize it now..  */
13bc0 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
13bd0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
13be0 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
13bf0 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20     *ppIdxInfo = 
13c00 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
13c10 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
13c20 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
13c30 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
13c40 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
13c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
13c60 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
13c70 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c  s point, the sql
13c80 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13c90 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70  structure that p
13ca0 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20  IdxInfo points. 
13cb0 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65   ** to will have
13cc0 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
13cd0 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67  d, either during
13ce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
13cf0 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20  ocation or.  ** 
13d00 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f  during some prio
13d10 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e  r invocation.  N
13d20 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  ow we just have 
13d30 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
13d40 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66  .  ** details of
13d50 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68   pIdxInfo for th
13d60 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
13d70 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74  tion and pass it
13d80 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e   to.  ** xBestIn
13d90 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  dex..  */..  /* 
13da0 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  The module name 
13db0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e  must be defined.
13dc0 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70   Also, by this p
13dd0 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a  oint there must.
13de0 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65    ** be a pointe
13df0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
13e00 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
13e10 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73  Otherwise.  ** s
13e20 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
13e30 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64  umnNames() would
13e40 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20   have picked up 
13e50 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f  the error. .  */
13e60 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
13e70 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
13e80 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
13e90 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  g[0] );.  assert
13ea0 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  ( sqlite3GetVTab
13eb0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
13ec0 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Tab) );..  /* Se
13ed0 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
13ee0 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
13ef0 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
13f00 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75   all .  ** outpu
13f10 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
13f20 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  ero..  **.  ** a
13f30 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
13f40 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ble is true for 
13f50 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72  constraints wher
13f60 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
13f70 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61  .  ** side conta
13f80 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e  ins only referen
13f90 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f  ces to tables to
13fa0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
13fb0 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61   current.  ** ta
13fc0 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
13fd0 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e  ords, if the con
13fe0 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
13ff0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
14000 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  *           colu
14010 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20  mn = expr.  **. 
14020 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
14030 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
14040 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
14050 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
14060 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61  is .  ** only va
14070 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
14080 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
14090 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
140a0 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
140b0 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
140c0 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  ing column..  **
140d0 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74  .  ** The aConst
140e0 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63  raints[] array c
140f0 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
14100 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
14110 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
14120 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20  current table.  
14130 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79  That way we only
14140 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65   have to compute
14150 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76   it once.  ** ev
14160 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67  en though we mig
14170 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74  ht try to pick t
14180 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75  he best index mu
14190 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20  ltiple times..  
141a0 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
141b0 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
141c0 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
141d0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
141e0 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  the.  ** join mi
141f0 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
14200 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
14210 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
14220 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61  ble flag.  ** ea
14230 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ch time..  */.  
14240 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
14250 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14260 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
14270 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
14280 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20  raint;.  pUsage 
14290 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
142a0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
142b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
142c0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
142d0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
142e0 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78  +){.    j = pIdx
142f0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
14300 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  t;.    pTerm = &
14310 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70  pWC->a[j];.    p
14320 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
14330 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
14340 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29 20  Right&notReady) 
14350 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d  ? 0 : 1;.  }.  m
14360 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
14370 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
14380 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
14390 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28  nstraint);.  if(
143a0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
143b0 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
143c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
143d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
143e0 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  );.  }.  pIdxInf
143f0 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
14400 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
14410 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
14420 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
14430 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
14440 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
14450 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28  umed = 0;.  /* (
14460 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61  (double)2) In ca
14470 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
14480 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14490 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  ... */.  pIdxInf
144a0 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
144b0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
144c0 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b  L / ((double)2);
144d0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
144e0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
144f0 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42  ;.  if( !pOrderB
14500 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  y ){.    pIdxInf
14510 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  o->nOrderBy = 0;
14520 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62  .  }..  if( vtab
14530 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
14540 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
14550 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
14560 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73  .  }..  pIdxCons
14570 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
14580 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14590 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
145a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
145b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
145c0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
145d0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
145e0 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
145f0 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
14600 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70  pCost->used |= p
14610 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69  WC->a[pIdxCons[i
14620 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
14630 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
14640 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
14650 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
14660 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20   BY clause, and 
14670 74 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72  the selected vir
14680 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78  tual table index
14690 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  .  ** does not s
146a0 61 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65  atisfy it, incre
146b0 61 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ase the cost of 
146c0 74 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69  the scan accordi
146d0 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20  ngly. This.  ** 
146e0 6d 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63  matches the proc
146f0 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76  essing for non-v
14700 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
14710 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
14720 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20  )..  */.  rCost 
14730 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  = pIdxInfo->esti
14740 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28  matedCost;.  if(
14750 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64   pOrderBy && pId
14760 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
14770 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nsumed==0 ){.   
14780 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67   rCost += estLog
14790 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20  (rCost)*rCost;. 
147a0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73   }..  /* The cos
147b0 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
147c0 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
147d0 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
147e0 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74  L (the.  ** init
147f0 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65  al value of lowe
14800 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c  stCost in this l
14810 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74  oop. If it is, t
14820 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f  hen the.  ** (co
14830 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
14840 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
14850 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20  ever be true..  
14860 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64  ** .  ** Use "(d
14870 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64  ouble)2" instead
14880 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73   of "2.0" in cas
14890 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  e OMIT_FLOATING_
148a0 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64  POINT .  ** is d
148b0 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  efined..  */.  i
148c0 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
148d0 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c  BL/((double)2))<
148e0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43 6f  rCost ){.    pCo
148f0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c  st->rCost = (SQL
14900 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f  ITE_BIG_DBL/((do
14910 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73  uble)2));.  }els
14920 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  e{.    pCost->rC
14930 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d  ost = rCost;.  }
14940 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  .  pCost->plan.u
14950 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78  .pVtabIdx = pIdx
14960 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
14970 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
14980 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f  sumed ){.    pCo
14990 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
149a0 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
149b0 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e  Y;.  }.  pCost->
149c0 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  plan.nEq = 0;.  
149d0 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
149e0 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a  By = nOrderBy;..
149f0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
14a00 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e   a more efficien
14a10 74 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e  t access pattern
14a20 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   by using multip
14a30 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20  le indexes.  ** 
14a40 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f  to optimize an O
14a50 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  R expression wit
14a60 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c  hin the WHERE cl
14a70 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65  ause. .  */.  be
14a80 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
14a90 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
14aa0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
14ab0 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
14ac0 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69   pCost);.}.#endi
14ad0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14ae0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
14af0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
14b00 20 70 49 64 78 20 69 73 20 61 20 70 6f 69 6e 74   pIdx is a point
14b10 65 72 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 73  er to an index s
14b20 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 61  tructure that ha
14b30 73 20 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a  s an array of.**
14b40 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
14b50 4d 50 4c 45 53 20 65 76 65 6e 6c 79 20 73 70 61  MPLES evenly spa
14b60 63 65 64 20 73 61 6d 70 6c 65 73 20 6f 66 20 74  ced samples of t
14b70 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 65 64  he first indexed
14b80 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65   column.** store
14b90 64 20 69 6e 20 49 6e 64 65 78 2e 61 53 61 6d 70  d in Index.aSamp
14ba0 6c 65 2e 20 54 68 65 73 65 20 73 61 6d 70 6c 65  le. These sample
14bb0 73 20 64 69 76 69 64 65 20 74 68 65 20 64 6f 6d  s divide the dom
14bc0 61 69 6e 20 6f 66 20 76 61 6c 75 65 73 20 73 74  ain of values st
14bd0 6f 72 65 64 0a 2a 2a 20 74 68 65 20 69 6e 64 65  ored.** the inde
14be0 78 20 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49  x into (SQLITE_I
14bf0 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20  NDEX_SAMPLES+1) 
14c00 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69  regions..** Regi
14c10 6f 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c  on 0 contains al
14c20 6c 20 76 61 6c 75 65 73 20 6c 65 73 73 20 74 68  l values less th
14c30 61 6e 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  an the first sam
14c40 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67 69 6f  ple value. Regio
14c50 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e 73 20  n.** 1 contains 
14c60 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 74  values between t
14c70 68 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63  he first and sec
14c80 6f 6e 64 20 73 61 6d 70 6c 65 73 2e 20 20 52 65  ond samples.  Re
14c90 67 69 6f 6e 20 32 20 63 6f 6e 74 61 69 6e 73 0a  gion 2 contains.
14ca0 2a 2a 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ** values betwee
14cb0 6e 20 73 61 6d 70 6c 65 73 20 32 20 61 6e 64 20  n samples 2 and 
14cc0 33 2e 20 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20  3.  And so on.  
14cd0 52 65 67 69 6f 6e 20 53 51 4c 49 54 45 5f 49 4e  Region SQLITE_IN
14ce0 44 45 58 5f 53 41 4d 50 4c 45 53 0a 2a 2a 20 63  DEX_SAMPLES.** c
14cf0 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73 20 6c  ontains values l
14d00 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
14d10 61 73 74 20 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a  ast sample..**.*
14d20 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 63  * If the index c
14d30 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 64 75 70  ontains many dup
14d40 6c 69 63 61 74 65 73 20 6f 66 20 61 20 73 69 6e  licates of a sin
14d50 67 6c 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  gle value, then 
14d60 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
14d70 65 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  e that two or mo
14d80 72 65 20 61 64 6a 61 63 65 6e 74 20 73 61 6d 70  re adjacent samp
14d90 6c 65 73 20 63 61 6e 20 68 6f 6c 64 20 74 68 65  les can hold the
14da0 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 20   same value..** 
14db0 57 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65  When that is the
14dc0 20 63 61 73 65 2c 20 74 68 65 20 73 6d 61 6c 6c   case, the small
14dd0 65 73 74 20 70 6f 73 73 69 62 6c 65 20 72 65 67  est possible reg
14de0 69 6f 6e 20 63 6f 64 65 20 69 73 20 72 65 74 75  ion code is retu
14df0 72 6e 65 64 0a 2a 2a 20 77 68 65 6e 20 72 6f 75  rned.** when rou
14e00 6e 64 55 70 20 69 73 20 66 61 6c 73 65 20 61 6e  ndUp is false an
14e10 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 6f  d the largest po
14e20 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f  ssible region co
14e30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
14e40 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69  * when roundUp i
14e50 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
14e60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
14e70 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
14e80 6d 69 6e 65 73 20 77 68 69 63 68 20 6f 66 20 74  mines which of t
14e90 68 65 20 72 65 67 69 6f 6e 73 20 76 61 6c 75 65  he regions value
14ea0 20 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73 20 69   .** pVal lies i
14eb0 6e 2c 20 73 65 74 73 20 2a 70 69 52 65 67 69 6f  n, sets *piRegio
14ec0 6e 20 74 6f 20 74 68 65 20 72 65 67 69 6f 6e 20  n to the region 
14ed0 69 6e 64 65 78 20 28 61 20 76 61 6c 75 65 20 62  index (a value b
14ee0 65 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20  etween 0.** and 
14ef0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
14f00 50 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76  PLES+1, inclusiv
14f10 65 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  e) and returns S
14f20 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
14f30 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   if an OOM occur
14f40 73 20 77 68 69 6c 65 20 63 6f 6e 76 65 72 74 69  s while converti
14f50 6e 67 20 74 65 78 74 20 76 61 6c 75 65 73 20 62  ng text values b
14f60 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73  etween encodings
14f70 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
14f80 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
14f90 64 20 2a 70 69 52 65 67 69 6f 6e 20 69 73 20 75  d *piRegion is u
14fa0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  ndefined..*/.#if
14fb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14fc0 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69  E_STAT2.static i
14fd0 6e 74 20 77 68 65 72 65 52 61 6e 67 65 52 65 67  nt whereRangeReg
14fe0 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
14ff0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
15000 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
15010 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
15020 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
15030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15040 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
15050 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
15060 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
15070 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
15080 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
15090 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
150a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
150b0 20 2f 2a 20 52 65 74 75 72 6e 20 6c 61 72 67 65   /* Return large
150c0 73 74 20 76 61 6c 69 64 20 72 65 67 69 6f 6e 20  st valid region 
150d0 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
150e0 20 2a 70 69 52 65 67 69 6f 6e 20 20 20 20 20 20   *piRegion      
150f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15100 20 52 65 67 69 6f 6e 20 6f 66 20 64 6f 6d 61 69   Region of domai
15110 6e 20 69 6e 20 77 68 69 63 68 20 76 61 6c 75 65  n in which value
15120 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20 20 61 73   lies */.){.  as
15130 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
15140 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
15150 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
15160 56 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  Val) ){.    Inde
15170 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
15180 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
15190 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  ;.    int i = 0;
151a0 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d  .    int eType =
151b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
151c0 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 20 20  ype(pVal);..    
151d0 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
151e0 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54 79  E_INTEGER || eTy
151f0 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
15200 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
15210 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   r = sqlite3_val
15220 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b  ue_double(pVal);
15230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15240 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  i<SQLITE_INDEX_S
15250 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20  AMPLES; i++){.  
15260 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15270 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
15280 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
15290 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
152a0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
152b0 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20  >=SQLITE_TEXT ) 
152c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
152d0 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20  f( roundUp ){.  
152e0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
152f0 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29 20 62  ple[i].u.r>r ) b
15300 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
15310 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
15320 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
15330 72 3e 3d 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=r ) break;.  
15340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54      }else if( eT
15360 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
15370 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b   ){.      i = 0;
15380 0a 20 20 20 20 20 20 69 66 28 20 72 6f 75 6e 64  .      if( round
15390 55 70 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  Up ){.        wh
153a0 69 6c 65 28 20 69 3c 53 51 4c 49 54 45 5f 49 4e  ile( i<SQLITE_IN
153b0 44 45 58 5f 53 41 4d 50 4c 45 53 20 26 26 20 61  DEX_SAMPLES && a
153c0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
153d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69  =SQLITE_NULL ) i
153e0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
153f0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 73 71  }else{ .      sq
15400 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15410 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f  se->db;.      Co
15420 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
15430 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b      const u8 *z;
15440 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  .      int n;.. 
15450 20 20 20 20 20 2f 2a 20 70 56 61 6c 20 63 6f 6d       /* pVal com
15460 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 56  es from sqlite3V
15470 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29 20 73  alueFromExpr() s
15480 6f 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f  o the type canno
15490 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  t be NULL */.   
154a0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
154b0 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
154c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
154d0 4c 4f 42 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  LOB );..      if
154e0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
154f0 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
15500 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
15510 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
15520 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  ob(pVal);.      
15530 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
15540 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
15550 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e   assert( pColl->
15560 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
15570 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
15580 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
15590 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
155a0 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
155b0 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a  F8, 0, *pIdx->az
155c0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
155d0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
155e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
155f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15600 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
15610 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73  ion sequence: %s
15620 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 49               *pI
15640 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20  dx->azColl);.   
15650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15660 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20      }.        z 
15680 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71  = (const u8 *)sq
15690 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
156a0 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
156b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
156c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
156d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
156e0 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
156f0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26       assert( z &
15700 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  & pColl && pColl
15710 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20  ->xCmp );.      
15720 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  }.      n = sqli
15730 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56  te3ValueBytes(pV
15740 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
15750 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
15760 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   i<SQLITE_INDEX_
15770 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20  SAMPLES; i++){. 
15780 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
15790 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c        int eSampl
157a0 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b  etype = aSample[
157b0 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  i].eType;.      
157c0 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70    if( eSampletyp
157d0 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c  e==SQLITE_NULL |
157e0 7c 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54  | eSampletype<eT
157f0 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ype ) continue;.
15800 20 20 20 20 20 20 20 20 69 66 28 20 28 65 53 61          if( (eSa
15810 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65 29  mpletype!=eType)
15820 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65   ) break;.#ifnde
15830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
15840 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28 20  F16.        if( 
15850 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49  pColl->enc!=SQLI
15860 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20  TE_UTF8 ){.     
15870 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65       int nSample
15880 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
15890 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69   *zSample = sqli
158a0 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20 20  te3Utf8to16(.   
158b0 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70             db, p
158c0 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70  Coll->enc, aSamp
158d0 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70  le[i].u.z, aSamp
158e0 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53  le[i].nByte, &nS
158f0 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20 20  ample.          
15900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15910 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20   !zSample ){.   
15920 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
15930 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15940 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d );.           
15950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15960 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
15970 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
15980 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
15990 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c  l->pUser, nSampl
159a0 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a  e, zSample, n, z
159b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
159c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
159d0 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 20  Sample);.       
159e0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
159f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15a00 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d    c = pColl->xCm
15a10 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
15a20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65  aSample[i].nByte
15a30 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
15a40 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  , n, z);.       
15a50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
15a60 2d 72 6f 75 6e 64 55 70 3e 3d 30 20 29 20 62 72  -roundUp>=0 ) br
15a70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15a80 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
15a90 69 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c 49 54  i>=0 && i<=SQLIT
15aa0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
15ab0 29 3b 0a 20 20 20 20 2a 70 69 52 65 67 69 6f 6e  );.    *piRegion
15ac0 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
15ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15ae0 23 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 66 64  #endif   /* #ifd
15af0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15b00 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT2 */../*.**
15b10 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
15b20 45 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20  Expr represents 
15b30 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c  a literal value,
15b40 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
15b50 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74  t to.** an sqlit
15b60 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
15b70 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
15b80 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69  e same value, wi
15b90 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  th affinity.** a
15ba0 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
15bb0 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  , before returni
15bc0 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ng. It is the re
15bd0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15be0 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
15bf0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
15c00 65 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74  ease this struct
15c10 75 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69  ure by passing i
15c20 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  t to .** sqlite3
15c30 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a  ValueFree()..**.
15c40 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
15c50 74 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63  t parse is a rec
15c60 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52  ompile (sqlite3R
15c70 65 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20  eprepare()) and 
15c80 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53  pExpr.** is an S
15c90 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  QL variable that
15ca0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
15cb0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
15cc0 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20  bound to it,.** 
15cd0 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
15ce0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
15cf0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  e containing thi
15d00 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77  s value, again w
15d10 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ith.** affinity 
15d20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69  aff applied to i
15d30 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  t, instead..**.*
15d40 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20  * If neither of 
15d50 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c  the above apply,
15d60 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
15d70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
15d80 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
15d90 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
15da0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
15db0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65  ITE_OK..*/.#ifde
15dc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15dd0 53 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74  STAT2.static int
15de0 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
15df0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15e00 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
15e10 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73   .  u8 aff, .  s
15e20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
15e30 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  p.){.  if( pExpr
15e40 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
15e50 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  E.   || (pExpr->
15e60 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
15e70 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
15e80 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b  K_VARIABLE).  ){
15e90 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20  .    int iVar = 
15ea0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
15eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15ec0 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
15ed0 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 20  ->pVdbe, iVar); 
15ee0 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d  /* IMP: R-23257-
15ef0 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a 70 70  02778 */.    *pp
15f00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
15f10 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  tValue(pParse->p
15f20 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
15f30 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72   aff);.    retur
15f40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15f50 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
15f60 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
15f70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
15f80 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61  , SQLITE_UTF8, a
15f90 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69  ff, pp);.}.#endi
15fa0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
15fb0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
15fc0 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
15fd0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
15fe0 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74  at will be visit
15ff0 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e  ed.** by scannin
16000 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61  g an index for a
16010 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73   range of values
16020 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20  . The range may 
16030 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a  have an upper.**
16040 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20   bound, a lower 
16050 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20  bound, or both. 
16060 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
16070 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20   terms that set 
16080 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64  the upper.** and
16090 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72   lower bounds ar
160a0 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  e represented by
160b0 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
160c0 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  er respectively.
160d0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
160e0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
160f0 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
16100 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  a):.**.**   ... 
16110 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
16120 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
16130 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
16140 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20          |_____| 
16150 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20    |_____|.**    
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a     |         |.*
16180 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16190 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20        pLower    
161a0 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  pUpper.**.** If 
161b0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70  either of the up
161c0 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
161d0 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nd is not presen
161e0 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  t, then NULL is 
161f0 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61  passed in.** pla
16200 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ce of the corres
16210 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72  ponding WhereTer
16220 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71  m..**.** The nEq
16230 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
16240 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f  ssed the index o
16250 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
16260 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
16270 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74  e.** range const
16280 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
16290 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
162a0 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
162b0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f  constraints.** o
162c0 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
162d0 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
162e0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
162f0 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  , assuming index
16300 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61   p is.** on t1(a
16310 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
16320 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
16330 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
16340 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
16350 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
16360 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
16370 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  Eq should be pas
16380 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20  sed the value 1 
16390 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
163a0 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
163b0 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65  .** b, is the se
163c0 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63  cond left-most c
163d0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
163e0 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
163f0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
16400 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
16410 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
16420 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
16430 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
16440 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a   passed 0..**.**
16450 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
16460 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lue is an intege
16470 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
16480 31 30 30 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  100, inclusive. 
16490 41 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75  A return.** valu
164a0 65 20 6f 66 20 31 20 69 6e 64 69 63 61 74 65 73  e of 1 indicates
164b0 20 74 68 61 74 20 74 68 65 20 70 72 6f 70 6f 73   that the propos
164c0 65 64 20 72 61 6e 67 65 20 73 63 61 6e 20 69 73  ed range scan is
164d0 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
164e0 69 74 0a 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74  it.** approximat
164f0 65 6c 79 20 31 2f 31 30 30 74 68 20 28 31 25 29  ely 1/100th (1%)
16500 20 6f 66 20 74 68 65 20 72 6f 77 73 20 73 65 6c   of the rows sel
16510 65 63 74 65 64 20 62 79 20 74 68 65 20 6e 45 71  ected by the nEq
16520 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
16530 73 74 72 61 69 6e 74 73 20 28 69 66 20 61 6e 79  straints (if any
16540 29 2e 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75  ). A return valu
16550 65 20 6f 66 20 31 30 30 20 69 6e 64 69 63 61 74  e of 100 indicat
16560 65 73 20 74 68 61 74 20 69 74 20 69 73 20 65 78  es that it is ex
16570 70 65 63 74 65 64 0a 2a 2a 20 74 68 61 74 20 74  pected.** that t
16580 68 65 20 72 61 6e 67 65 20 73 63 61 6e 20 77 69  he range scan wi
16590 6c 6c 20 76 69 73 69 74 20 65 76 65 72 79 20 72  ll visit every r
165a0 6f 77 20 28 31 30 30 25 29 20 73 65 6c 65 63 74  ow (100%) select
165b0 65 64 20 62 79 20 74 68 65 20 65 71 75 61 6c 69  ed by the equali
165c0 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  ty.** constraint
165d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  s..**.** In the 
165e0 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74  absence of sqlit
165f0 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20  e_stat2 ANALYZE 
16600 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65  data, each range
16610 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72   inequality.** r
16620 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
16630 68 20 73 70 61 63 65 20 62 79 20 33 2f 34 74 68  h space by 3/4th
16640 73 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67  s.  Hence a sing
16650 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78  le constraint (x
16660 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  >?).** results i
16670 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 32 35  n a return of 25
16680 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e   and a range con
16690 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44  straint (x>? AND
166a0 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a   x<?) results.**
166b0 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
166c0 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  6..*/.static int
166d0 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
166e0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
166f0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
16700 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
16710 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
16720 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
16730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16740 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e   index containin
16750 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  g the range-comp
16760 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22  ared column; "x"
16770 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20   */.  int nEq,  
16780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
16790 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c  dex into p->aCol
167a0 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d  [] of the range-
167b0 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20  compared column 
167c0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
167d0 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77  pLower,   /* Low
167e0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
167f0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32  range. ex: "x>12
16800 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  3" Might be NULL
16810 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
16820 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70  *pUpper,   /* Up
16830 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
16840 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34   range. ex: "x<4
16850 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  55" Might be NUL
16860 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 73  L */.  int *piEs
16870 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
16880 55 54 3a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  UT: Return value
16890 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
168a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
168b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
168c0 4c 45 5f 53 54 41 54 32 0a 0a 20 20 69 66 28 20  LE_STAT2..  if( 
168d0 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 61 53 61  nEq==0 && p->aSa
168e0 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  mple ){.    sqli
168f0 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 6f 77 65  te3_value *pLowe
16900 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  rVal = 0;.    sq
16910 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 55 70  lite3_value *pUp
16920 70 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  perVal = 0;.    
16930 69 6e 74 20 69 45 73 74 3b 0a 20 20 20 20 69 6e  int iEst;.    in
16940 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20  t iLower = 0;.  
16950 20 20 69 6e 74 20 69 55 70 70 65 72 20 3d 20 53    int iUpper = S
16960 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16970 4c 45 53 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75  LES;.    int rou
16980 6e 64 55 70 55 70 70 65 72 20 3d 20 30 3b 0a 20  ndUpUpper = 0;. 
16990 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 4c 6f     int roundUpLo
169a0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 75 38 20  wer = 0;.    u8 
169b0 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
169c0 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
169d0 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  n[0]].affinity;.
169e0 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20  .    if( pLower 
169f0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16a00 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
16a10 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
16a20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
16a30 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
16a40 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77  Expr, aff, &pLow
16a50 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  erVal);.      as
16a60 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f  sert( pLower->eO
16a70 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c  perator==WO_GT |
16a80 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61  | pLower->eOpera
16a90 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20  tor==WO_GE );.  
16aa0 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72      roundUpLower
16ab0 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65   = (pLower->eOpe
16ac0 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20 3f 31  rator==WO_GT) ?1
16ad0 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  :0;.    }.    if
16ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16af0 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
16b00 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
16b10 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
16b20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
16b30 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
16b40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16b50 61 66 66 2c 20 26 70 55 70 70 65 72 56 61 6c 29  aff, &pUpperVal)
16b60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16b70 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
16b80 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70  r==WO_LT || pUpp
16b90 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
16ba0 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 72 6f  O_LE );.      ro
16bb0 75 6e 64 55 70 55 70 70 65 72 20 3d 20 28 70 55  undUpUpper = (pU
16bc0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
16bd0 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a 20 20  =WO_LE) ?1:0;.  
16be0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
16bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
16c00 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20 70  LowerVal==0 && p
16c10 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a  UpperVal==0) ){.
16c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
16c30 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c  ueFree(pLowerVal
16c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16c50 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72  ValueFree(pUpper
16c60 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  Val);.      goto
16c70 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62   range_est_fallb
16c80 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ack;.    }else i
16c90 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20  f( pLowerVal==0 
16ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
16cb0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
16cc0 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72  Parse, p, pUpper
16cd0 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70 70 65  Val, roundUpUppe
16ce0 72 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20  r, &iUpper);.   
16cf0 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 20     if( pLower ) 
16d00 69 4c 6f 77 65 72 20 3d 20 69 55 70 70 65 72 2f  iLower = iUpper/
16d10 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
16d20 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 20 29 7b   pUpperVal==0 ){
16d30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
16d40 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61  eRangeRegion(pPa
16d50 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61  rse, p, pLowerVa
16d60 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c  l, roundUpLower,
16d70 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20   &iLower);.     
16d80 20 69 66 28 20 70 55 70 70 65 72 20 29 20 69 55   if( pUpper ) iU
16d90 70 70 65 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b  pper = (iLower +
16da0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
16db0 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20  MPLES + 1)/2;.  
16dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16dd0 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65  c = whereRangeRe
16de0 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  gion(pParse, p, 
16df0 70 55 70 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64  pUpperVal, round
16e00 55 70 55 70 70 65 72 2c 20 26 69 55 70 70 65 72  UpUpper, &iUpper
16e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e30 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
16e40 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
16e50 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c  se, p, pLowerVal
16e60 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20  , roundUpLower, 
16e70 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20  &iLower);.      
16e80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  }.    }.    WHER
16e90 45 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73  ETRACE(("range s
16ea0 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e  can regions: %d.
16eb0 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20  .%d\n", iLower, 
16ec0 69 55 70 70 65 72 29 29 3b 0a 0a 20 20 20 20 69  iUpper));..    i
16ed0 45 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Est = iUpper - i
16ee0 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63  Lower;.    testc
16ef0 61 73 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54  ase( iEst==SQLIT
16f00 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
16f10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
16f20 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  Est<=SQLITE_INDE
16f30 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
16f40 20 69 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20   if( iEst<1 ){. 
16f50 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20 35 30       *piEst = 50
16f60 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  /SQLITE_INDEX_SA
16f70 4d 50 4c 45 53 3b 0a 20 20 20 20 7d 65 6c 73 65  MPLES;.    }else
16f80 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d  {.      *piEst =
16f90 20 28 69 45 73 74 2a 31 30 30 29 2f 53 51 4c 49   (iEst*100)/SQLI
16fa0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
16fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16fc0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f  te3ValueFree(pLo
16fd0 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  werVal);.    sql
16fe0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55  ite3ValueFree(pU
16ff0 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 72 65  pperVal);.    re
17000 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e  turn rc;.  }.ran
17010 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a  ge_est_fallback:
17020 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
17030 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
17040 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
17050 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
17060 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71  ED_PARAMETER(nEq
17070 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
17080 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
17090 70 70 65 72 20 29 3b 0a 20 20 2a 70 69 45 73 74  pper );.  *piEst
170a0 20 3d 20 31 30 30 3b 0a 20 20 69 66 28 20 70 4c   = 100;.  if( pL
170b0 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
170c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
170d0 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 69 45  VNULL)==0 ) *piE
170e0 73 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28 20 70  st /= 4;.  if( p
170f0 55 70 70 65 72 20 29 20 2a 70 69 45 73 74 20 2f  Upper ) *piEst /
17100 3d 20 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 4;.  return rc
17110 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
17120 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
17130 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
17140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17150 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
17160 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
17170 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
17180 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
17190 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
171a0 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
171b0 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
171c0 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
171d0 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
171e0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
171f0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
17200 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
17210 74 65 5f 73 74 61 74 32 20 68 69 73 74 6f 67 72  te_stat2 histogr
17220 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
17230 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
17240 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
17250 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
17260 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
17270 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
17280 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
17290 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
172a0 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
172b0 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
172c0 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
172d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
172e0 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
172f0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
17300 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
17310 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
17320 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
17330 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
17340 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
17350 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
17360 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
17370 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
17380 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
17390 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
173a0 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
173b0 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
173c0 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
173d0 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
173e0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
173f0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
17400 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
17410 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
17420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17430 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
17440 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
17450 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17460 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
17470 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17480 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
17490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
174a0 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
174b0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
174c0 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20  pTerm */.  Expr 
174d0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
174e0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
174f0 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
17500 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
17510 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  t */.  double *p
17520 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
17530 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
17540 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
17550 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
17560 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d  e3_value *pRhs =
17570 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e   0;  /* VALUE on
17580 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
17590 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69   of pTerm */.  i
175a0 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
175b0 72 3b 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  r;       /* Rang
175c0 65 20 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72  e of histogram r
175d0 65 67 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e  egions containin
175e0 67 20 70 52 68 73 20 2a 2f 0a 20 20 75 38 20 61  g pRhs */.  u8 a
175f0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
17600 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
17610 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
17620 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17630 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
17640 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
17650 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  de */.  double n
17660 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20  RowEst;         
17670 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
17680 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
17690 6f 66 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 61 73  of rows */..  as
176a0 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
176b0 21 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70  !=0 );.  aff = p
176c0 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
176d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
176e0 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70  ffinity;.  if( p
176f0 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  Expr ){.    rc =
17700 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
17710 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
17720 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69  f, &pRhs);.    i
17730 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
17740 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63  reEqualScanEst_c
17750 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ancel;.  }else{.
17760 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74      pRhs = sqlit
17770 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73  e3ValueNew(pPars
17780 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66  e->db);.  }.  if
17790 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75  ( pRhs==0 ) retu
177a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
177b0 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  ND;.  rc = where
177c0 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
177d0 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20  se, p, pRhs, 0, 
177e0 26 69 4c 6f 77 65 72 29 3b 0a 20 20 69 66 28 20  &iLower);.  if( 
177f0 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
17800 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17810 65 6c 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65  el;.  rc = where
17820 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
17830 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 31 2c 20  se, p, pRhs, 1, 
17840 26 69 55 70 70 65 72 29 3b 0a 20 20 69 66 28 20  &iUpper);.  if( 
17850 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
17860 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17870 65 6c 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  el;.  WHERETRACE
17880 28 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e  (("equality scan
17890 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64   regions: %d..%d
178a0 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70  \n", iLower, iUp
178b0 70 65 72 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f  per));.  if( iLo
178c0 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
178d0 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e     nRowEst = p->
178e0 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c  aiRowEst[0]/(SQL
178f0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
17900 53 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  S*2);.    if( nR
17910 6f 77 45 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a  owEst<*pnRow ) *
17920 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
17930 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52  .  }else{.    nR
17940 6f 77 45 73 74 20 3d 20 28 69 55 70 70 65 72 2d  owEst = (iUpper-
17950 69 4c 6f 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77  iLower)*p->aiRow
17960 45 73 74 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e  Est[0]/SQLITE_IN
17970 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20  DEX_SAMPLES;.   
17980 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
17990 74 3b 0a 20 20 7d 0a 0a 77 68 65 72 65 45 71 75  t;.  }..whereEqu
179a0 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c  alScanEst_cancel
179b0 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  :.  sqlite3Value
179c0 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65  Free(pRhs);.  re
179d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
179e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
179f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
17a00 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
17a10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
17a20 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
17a30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17a40 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
17a50 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
17a60 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
17a70 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
17a80 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
17a90 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
17aa0 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
17ab0 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
17ac0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
17ad0 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
17ae0 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
17af0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
17b00 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
17b10 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
17b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
17b30 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
17b40 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
17b50 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
17b60 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
17b70 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17b80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17b90 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17ba0 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
17bb0 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
17bc0 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
17bd0 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
17be0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
17bf0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
17c00 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
17c10 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
17c20 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
17c30 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
17c40 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
17c50 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
17c60 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
17c70 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17c80 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
17c90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17ca0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
17cb0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17cc0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
17cd0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17ce0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
17cf0 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ose left-most co
17d00 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f  lumn is pTerm */
17d10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
17d20 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76  st,     /* The v
17d30 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65  alue list on the
17d40 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76   RHS of "x IN (v
17d50 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f  1,v2,v3,...)" */
17d60 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
17d70 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
17d80 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
17d90 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
17da0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
17db0 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
17dc0 20 2f 2a 20 4f 6e 65 20 76 61 6c 75 65 20 66 72   /* One value fr
17dd0 6f 6d 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  om list */.  int
17de0 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 3b   iLower, iUpper;
17df0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
17e00 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67  of histogram reg
17e10 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ions containing 
17e20 70 52 68 73 20 2a 2f 0a 20 20 75 38 20 61 66 66  pRhs */.  u8 aff
17e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e40 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66      /* Column af
17e50 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20  finity */.  int 
17e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
17e70 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63        /* Subfunc
17e80 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65  tion return code
17e90 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f   */.  double nRo
17ea0 77 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  wEst;           
17eb0 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
17ec0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
17ed0 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   rows */.  int n
17ee0 53 70 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Span = 0;       
17ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17f00 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69  f histogram regi
17f10 6f 6e 73 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20  ons spanned */. 
17f20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30   int nSingle = 0
17f30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69  ;          /* Hi
17f40 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20  stogram regions 
17f50 68 69 74 20 62 79 20 61 20 73 69 6e 67 6c 65 20  hit by a single 
17f60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  value */.  int n
17f70 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20  NotFound = 0;   
17f80 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66       /* Count of
17f90 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
17fa0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 2a   not constants *
17fb0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
17fe0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
17ff0 20 61 53 70 61 6e 5b 53 51 4c 49 54 45 5f 49 4e   aSpan[SQLITE_IN
18000 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20  DEX_SAMPLES+1]; 
18010 20 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20     /* Histogram 
18020 72 65 67 69 6f 6e 73 20 74 68 61 74 20 61 72 65  regions that are
18030 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20 75 38   spanned */.  u8
18040 20 61 53 69 6e 67 6c 65 5b 53 51 4c 49 54 45 5f   aSingle[SQLITE_
18050 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d  INDEX_SAMPLES+1]
18060 3b 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20  ;  /* Histogram 
18070 72 65 67 69 6f 6e 73 20 68 69 74 20 6f 6e 63 65  regions hit once
18080 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
18090 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
180a0 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
180b0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
180c0 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
180d0 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 70 61 6e  ;.  memset(aSpan
180e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  , 0, sizeof(aSpa
180f0 6e 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53  n));.  memset(aS
18100 69 6e 67 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  ingle, 0, sizeof
18110 28 61 53 69 6e 67 6c 65 29 29 3b 0a 20 20 66 6f  (aSingle));.  fo
18120 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18130 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18140 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
18150 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 63 20  e(pVal);.    rc 
18160 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
18170 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
18180 5b 69 5d 2e 70 45 78 70 72 2c 20 61 66 66 2c 20  [i].pExpr, aff, 
18190 26 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  &pVal);.    if( 
181a0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
181b0 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c 7c 20 73  if( pVal==0 || s
181c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
181d0 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f  e(pVal)==SQLITE_
181e0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6e 4e  NULL ){.      nN
181f0 6f 74 46 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20  otFound++;.     
18200 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
18210 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52  .    rc = whereR
18220 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
18230 65 2c 20 70 2c 20 70 56 61 6c 2c 20 30 2c 20 26  e, p, pVal, 0, &
18240 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28  iLower);.    if(
18250 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
18260 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
18270 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
18280 2c 20 70 56 61 6c 2c 20 31 2c 20 26 69 55 70 70  , pVal, 1, &iUpp
18290 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  er);.    if( rc 
182a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
182b0 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
182c0 29 7b 0a 20 20 20 20 20 20 61 53 69 6e 67 6c 65  ){.      aSingle
182d0 5b 69 4c 6f 77 65 72 5d 20 3d 20 31 3b 0a 20 20  [iLower] = 1;.  
182e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
182f0 73 73 65 72 74 28 20 69 4c 6f 77 65 72 3e 3d 30  ssert( iLower>=0
18300 20 26 26 20 69 55 70 70 65 72 3c 3d 53 51 4c 49   && iUpper<=SQLI
18310 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
18320 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
18330 20 69 4c 6f 77 65 72 3c 69 55 70 70 65 72 20 29   iLower<iUpper )
18340 20 61 53 70 61 6e 5b 69 4c 6f 77 65 72 2b 2b 5d   aSpan[iLower++]
18350 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
18360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18370 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  _OK ){.    for(i
18380 3d 6e 53 70 61 6e 3d 30 3b 20 69 3c 3d 53 51 4c  =nSpan=0; i<=SQL
18390 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
183a0 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  S; i++){.      i
183b0 66 28 20 61 53 70 61 6e 5b 69 5d 20 29 7b 0a 20  f( aSpan[i] ){. 
183c0 20 20 20 20 20 20 20 6e 53 70 61 6e 2b 2b 3b 0a         nSpan++;.
183d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
183e0 61 53 69 6e 67 6c 65 5b 69 5d 20 29 7b 0a 20 20  aSingle[i] ){.  
183f0 20 20 20 20 20 20 6e 53 69 6e 67 6c 65 2b 2b 3b        nSingle++;
18400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18410 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 28 6e 53     nRowEst = (nS
18420 70 61 6e 2a 32 2b 6e 53 69 6e 67 6c 65 29 2a 70  pan*2+nSingle)*p
18430 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 32  ->aiRowEst[0]/(2
18440 2a 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  *SQLITE_INDEX_SA
18450 4d 50 4c 45 53 29 0a 20 20 20 20 20 20 20 20 20  MPLES).         
18460 20 20 20 20 20 20 2b 20 6e 4e 6f 74 46 6f 75 6e        + nNotFoun
18470 64 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b 31 5d  d*p->aiRowEst[1]
18480 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  ;.    if( nRowEs
18490 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  t > p->aiRowEst[
184a0 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70  0] ) nRowEst = p
184b0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
184c0 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
184d0 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
184e0 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74  ACE(("IN row est
184f0 69 6d 61 74 65 3a 20 6e 53 70 61 6e 3d 25 64 2c  imate: nSpan=%d,
18500 20 6e 53 69 6e 67 6c 65 3d 25 64 2c 20 6e 4e 6f   nSingle=%d, nNo
18510 74 46 6f 75 6e 64 3d 25 64 2c 20 65 73 74 3d 25  tFound=%d, est=%
18520 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
18530 20 20 20 20 20 20 20 6e 53 70 61 6e 2c 20 6e 53         nSpan, nS
18540 69 6e 67 6c 65 2c 20 6e 4e 6f 74 46 6f 75 6e 64  ingle, nNotFound
18550 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
18560 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18570 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
18580 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18590 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
185a0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29  TE_ENABLE_STAT2)
185b0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   */.../*.** Find
185c0 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
185d0 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
185e0 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
185f0 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
18600 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
18610 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
18620 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
18630 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
18640 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c  lied as the.** l
18650 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ast parameter..*
18660 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
18670 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20  cost plan wins. 
18680 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20   The cost is an 
18690 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
186a0 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55  amount of.** CPU
186b0 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65   and disk I/O ne
186c0 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  eded to process 
186d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
186e0 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  sult..** Factors
186f0 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
18700 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
18710 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
18720 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
18730 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
18740 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
18750 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
18760 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
18770 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
18780 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
18790 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
187a0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
187b0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
187c0 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
187d0 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
187e0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
187f0 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
18800 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
18810 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
18820 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 28  EXED BY clause (
18830 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74  pSrc->pIndex) at
18840 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
18850 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51  ble in.** the SQ
18860 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  L statement, the
18870 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18880 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70  only considers p
18890 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a  lans using the .
188a0 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ** named index. 
188b0 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20  If no such plan 
188c0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  is found, then t
188d0 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74  he returned cost
188e0 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49   is.** SQLITE_BI
188f0 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e  G_DBL. If a plan
18900 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75   is found that u
18910 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ses the named in
18920 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68  dex, .** then th
18930 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c  e cost is calcul
18940 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61  ated in the usua
18950 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l way..**.** If 
18960 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  a NOT INDEXED cl
18970 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49  ause (pSrc->notI
18980 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20 61  ndexed!=0) was a
18990 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
189a0 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
189b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
189c0 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
189d0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
189e0 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
189f0 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
18a00 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
18a10 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
18a20 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20   built-in rowid 
18a30 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69  primary key.** i
18a40 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
18a50 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
18a60 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
18a70 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
18a80 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
18a90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
18aa0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
18ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18ac0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
18ad0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
18ae0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
18af0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18b00 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
18b10 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
18b20 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
18b30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
18b40 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
18b50 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ble for indexing
18b60 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
18b70 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20  tValid,         
18b80 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
18b90 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
18ba0 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20  ny purpose */.  
18bb0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
18bc0 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
18bd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18be0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  se */.  WhereCos
18bf0 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20  t *pCost        
18c00 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f      /* Lowest co
18c10 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  st query plan */
18c20 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 20 3d  .){.  int iCur =
18c30 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
18c40 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
18c50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
18c60 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
18c70 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c90 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
18ca0 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
18cb0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18cd0 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f  opy of pProbe, o
18ce0 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20 69  r zero for IPK i
18cf0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71  ndex */.  int eq
18d00 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
18d10 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
18d20 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
18d30 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
18d40 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45 71  s */.  int idxEq
18d50 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
18d60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b     /* Index mask
18d70 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
18d80 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
18d90 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18db0 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
18dc0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
18dd0 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 75 6e  mary key */.  un
18de0 73 69 67 6e 65 64 20 69 6e 74 20 61 69 52 6f 77  signed int aiRow
18df0 45 73 74 50 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65  EstPk[2]; /* The
18e00 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75   aiRowEst[] valu
18e10 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
18e20 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43  dex */.  int aiC
18e30 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
18e40 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
18e50 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
18e60 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
18e70 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d 61 73  .  int wsFlagMas
18e80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
18e90 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20  * Allowed flags 
18ea0 69 6e 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  in pCost->plan.w
18eb0 73 46 6c 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49  sFlag */..  /* I
18ec0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
18ed0 73 74 20 74 6f 20 61 20 77 6f 72 73 74 2d 63 61  st to a worst-ca
18ee0 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65  se value */.  me
18ef0 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
18f00 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
18f10 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
18f20 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
18f30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53  ..  /* If the pS
18f40 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  rc table is the 
18f50 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
18f60 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20   LEFT JOIN then 
18f70 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20  we may not.  ** 
18f80 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  use an index to 
18f90 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20  satisfy IS NULL 
18fa0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
18fb0 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
18fc0 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65   is.  ** because
18fd0 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65   columns might e
18fe0 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c  nd up being NULL
18ff0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
19000 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20  es not match -. 
19010 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e   ** a circumstan
19020 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  ce which the ind
19030 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75  ex cannot help u
19040 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63  s discover.  Tic
19050 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a  ket #2177..  */.
19060 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e    if( pSrc->join
19070 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
19080 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
19090 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
190a0 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  N;.  }else{.    
190b0 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
190c0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
190d0 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66  SNULL;.  }..  if
190e0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
190f0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
19100 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
19110 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
19120 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
19130 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20  e */.    pIdx = 
19140 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
19150 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c 61  Index;.    wsFla
19160 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f  gMask = ~(WHERE_
19170 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
19180 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
19190 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64   eqTermMask = id
191a0 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d  xEqTermMask;.  }
191b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
191c0 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
191d0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
191e0 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
191f0 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
19200 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
19210 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
19220 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
19230 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
19240 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
19250 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
19260 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
19270 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
19280 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
19290 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
192a0 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
192b0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
192c0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
192d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
192e0 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
192f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
19300 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
19310 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
19320 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c  ));.    sPk.nCol
19330 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
19340 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
19350 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
19360 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f  .aiRowEst = aiRo
19370 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
19380 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
19390 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
193a0 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
193b0 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
193c0 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61  k[0] = pSrc->pTa
193d0 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
193e0 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
193f0 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
19400 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
19410 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
19420 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
19430 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
19440 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
19450 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
19460 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
19470 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
19480 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
19490 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
194a0 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
194b0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
194c0 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
194d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
194e0 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77 73  e = &sPk;.    ws
194f0 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20  FlagMask = ~(.  
19500 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55        WHERE_COLU
19510 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
19520 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
19530 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
19540 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29  LUMN_RANGE.    )
19550 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
19560 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
19570 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
19580 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
19590 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f  r all indices lo
195a0 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oking for the be
195b0 73 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20  st one to use.  
195c0 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
195d0 65 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70  e; pIdx=pProbe=p
195e0 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
195f0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
19600 64 20 69 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69  d int * const ai
19610 52 6f 77 45 73 74 20 3d 20 70 50 72 6f 62 65 2d  RowEst = pProbe-
19620 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 20 20 64  >aiRowEst;.    d
19630 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
19640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19650 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f  st of using pPro
19660 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  be */.    double
19670 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
19680 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
19690 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
196a0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
196b0 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  */.    double lo
196c0 67 31 30 4e 3b 20 20 20 20 20 20 20 20 20 20 20  g10N;           
196d0 20 20 20 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f     /* base-10 lo
196e0 67 61 72 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20  garithm of nRow 
196f0 28 69 6e 65 78 61 63 74 29 20 2a 2f 0a 20 20 20  (inexact) */.   
19700 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19720 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
19730 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
19740 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
19750 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73   = 0;.    Bitmas
19760 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20  k used = 0;..   
19770 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
19780 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  g variables are 
19790 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
197a0 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65  on the propertie
197b0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  s of.    ** inde
197c0 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  x being evaluate
197d0 64 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e  d. They are then
197e0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
197f0 6e 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  ne the expected.
19800 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20      ** cost and 
19810 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
19820 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a  eturned..    **.
19830 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20      **  nEq: .  
19840 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f    **    Number o
19850 66 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  f equality terms
19860 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70   that can be imp
19870 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74  lemented using t
19880 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
19890 20 20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72      In other wor
198a0 64 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ds, the number o
198b0 66 20 69 6e 69 74 69 61 6c 20 66 69 65 6c 64 73  f initial fields
198c0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68   in the index th
198d0 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 61 72 65  at.    **    are
198e0 20 75 73 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49   used in == or I
198f0 4e 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  N or NOT NULL co
19900 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
19910 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
19920 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49     **.    **  nI
19930 6e 4d 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20  nMul:  .    **  
19940 20 20 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70    The "in-multip
19950 6c 69 65 72 22 2e 20 54 68 69 73 20 69 73 20 61  lier". This is a
19960 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f  n estimate of ho
19970 77 20 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72  w many seek oper
19980 61 74 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20  ations .    **  
19990 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
199a0 72 66 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64  rform on the ind
199b0 65 78 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20  ex in question. 
199c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
199d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57  the .    **    W
199e0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a  HERE clause is:.
199f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
19a00 20 20 20 57 48 45 52 45 20 61 20 49 4e 20 28 31     WHERE a IN (1
19a10 2c 20 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e  , 2, 3) AND b IN
19a20 20 28 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a   (4, 5, 6).    *
19a30 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69  *.    **    SQLi
19a40 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20  te must perform 
19a50 39 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20  9 lookups on an 
19a60 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
19a70 20 73 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20   so nInMul is . 
19a80 20 20 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20     **    set to 
19a90 39 2e 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d  9. Given the sam
19aa0 65 20 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74  e schema and eit
19ab0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
19ac0 77 69 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20  wing WHERE .    
19ad0 2a 2a 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20  **    clauses:. 
19ae0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
19af0 20 20 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20    WHERE a =  1. 
19b00 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
19b10 20 61 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20   a >= 2.    **. 
19b20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20     **    nInMul 
19b30 69 73 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20  is set to 1..   
19b40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66   **.    **    If
19b50 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
19b60 57 48 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68  WHERE term of th
19b70 65 20 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45  e form "x IN (SE
19b80 4c 45 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e  LECT ...)", then
19b90 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20   .    **    the 
19ba0 73 75 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73  sub-select is as
19bb0 73 75 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20  sumed to return 
19bc0 32 35 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20  25 rows for the 
19bd0 70 75 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20  purposes of .   
19be0 20 2a 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69   **    determini
19bf0 6e 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a  ng nInMul..    *
19c00 2a 0a 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74  *.    **  bInEst
19c10 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65  :  .    **    Se
19c20 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  t to true if the
19c30 72 65 20 77 61 73 20 61 74 20 6c 65 61 73 74 20  re was at least 
19c40 6f 6e 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  one "x IN (SELEC
19c50 54 20 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65  T ...)" term use
19c60 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20  d .    **    in 
19c70 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20  determining the 
19c80 76 61 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e  value of nInMul.
19c90 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
19ca0 52 48 53 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  RHS of the.    *
19cb0 2a 20 20 20 20 49 4e 20 6f 70 65 72 61 74 6f 72  *    IN operator
19cc0 20 6d 75 73 74 20 62 65 20 61 20 53 45 4c 45 43   must be a SELEC
19cd0 54 2c 20 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c  T, not a value l
19ce0 69 73 74 2c 20 66 6f 72 20 74 68 69 73 20 76 61  ist, for this va
19cf0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20  riable.    **   
19d00 20 74 6f 20 62 65 20 74 72 75 65 2e 0a 20 20 20   to be true..   
19d10 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 73 74 42   **.    **  estB
19d20 6f 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ound:.    **    
19d30 41 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74  An estimate on t
19d40 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
19d50 20 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74   table that must
19d60 20 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41   be searched.  A
19d70 0a 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65  .    **    value
19d80 20 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68   of 100 means th
19d90 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69  e entire table i
19da0 73 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e  s searched.  Ran
19db0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
19dc0 20 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72     **    might r
19dd0 65 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20  educe this to a 
19de0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
19df0 31 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  100 to indicate 
19e00 74 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  that only.    **
19e10 20 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f      a fraction o
19e20 66 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64  f the table need
19e30 73 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e  s searching.  In
19e40 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a   the absence of.
19e50 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65      **    sqlite
19e60 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64  _stat2 ANALYZE d
19e70 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e  ata, a single in
19e80 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
19e90 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
19ea0 2a 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31  **    space to 1
19eb0 2f 34 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61  /4rd its origina
19ec0 6c 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78  l size.  So an x
19ed0 3e 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  >? constraint re
19ee0 64 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20  duces.    **    
19ef0 65 73 74 42 6f 75 6e 64 20 74 6f 20 32 35 2e 20  estBound to 25. 
19f00 20 54 77 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73   Two constraints
19f10 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
19f20 65 64 75 63 65 20 65 73 74 42 6f 75 6e 64 20 74  educe estBound t
19f30 6f 20 36 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 6..    **.    
19f40 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20 20  **  bSort:   .  
19f50 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e    **    Boolean.
19f60 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
19f70 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
19f80 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72  ause that will r
19f90 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a  equire an .    *
19fa0 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73 6f  *    external so
19fb0 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e  rt (i.e. scannin
19fc0 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  g the index bein
19fd0 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c 6c  g evaluated will
19fe0 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20 20   not .    **    
19ff0 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72 20  correctly order 
1a000 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a  records)..    **
1a010 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70  .    **  bLookup
1a020 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  : .    **    Boo
1a030 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61 20  lean. True if a 
1a040 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20  table lookup is 
1a050 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
1a060 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20  h index entry.  
1a070 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64 2e    **    visited.
1a080 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1a090 2c 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  , true if this i
1a0a0 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67  s not a covering
1a0b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20   index..    **  
1a0c0 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73    This is always
1a0d0 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 72   false for the r
1a0e0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1a0f0 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
1a100 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72  e..    **    For
1a110 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20   other indexes, 
1a120 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73  it is true unles
1a130 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  s all the column
1a140 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 20  s of the table. 
1a150 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62 79     **    used by
1a160 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1a170 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e  ement are presen
1a180 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 28  t in the index (
1a190 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20  such an.    **  
1a1a0 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65 74    index is somet
1a1b0 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20 61  imes described a
1a1c0 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1a1d0 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46  ex)..    **    F
1a1e0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76 65  or example, give
1a1f0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 28  n the index on (
1a200 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f 6e  a, b), the secon
1a210 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d of the followi
1a220 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74 77  ng .    **    tw
1a230 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69 72  o queries requir
1a240 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  es table b-tree 
1a250 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65 72  lookups in order
1a260 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61 6c   to find the val
1a270 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66 20  ue.    **    of 
1a280 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74 68  column c, but th
1a290 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74  e first does not
1a2a0 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
1a2b0 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20 20   a and b are.   
1a2c0 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61 69   **    both avai
1a2d0 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e 64  lable in the ind
1a2e0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1a2f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1a300 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f  LECT a, b    FRO
1a310 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1a320 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  1;.    **       
1a330 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1a340 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48  b, c FROM tbl WH
1a350 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1a360 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20  /.    int nEq;  
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a390 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1a3a0 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 2a  matching index *
1a3b0 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74  /.    int bInEst
1a3c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1a3d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22      /* True if "
1a3e0 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29  x IN (SELECT...)
1a3f0 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  " seen */.    in
1a400 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20  t nInMul = 1;   
1a410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a420 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
1a430 74 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f 20  t equalities to 
1a440 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 69 6e  lookup */.    in
1a450 74 20 65 73 74 42 6f 75 6e 64 20 3d 20 31 30 30  t estBound = 100
1a460 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ;           /* E
1a470 73 74 69 6d 61 74 65 64 20 72 65 64 75 63 74 69  stimated reducti
1a480 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70 61  on in search spa
1a490 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ce */.    int nB
1a4a0 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ound = 0;       
1a4b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a4c0 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  r of range const
1a4d0 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20  raints seen */. 
1a4e0 20 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30     int bSort = 0
1a4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a500 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74 65   /* True if exte
1a510 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69 72  rnal sort requir
1a520 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4c  ed */.    int bL
1a530 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20 20  ookup = 0;      
1a540 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a550 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e  if not a coverin
1a560 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57  g index */.    W
1a570 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a590 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
1a5a0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1a5b0 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e */.#ifdef SQLI
1a5c0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
1a5d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1a5e0 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20 20  FirstTerm = 0;  
1a5f0 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20    /* First term 
1a600 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e 64  matching the ind
1a610 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ex */.#endif..  
1a620 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
1a630 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6e 45 71  he values of nEq
1a640 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20   and nInMul */. 
1a650 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b 20 6e 45     for(nEq=0; nE
1a660 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
1a670 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20  n; nEq++){.     
1a680 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
1a690 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
1a6a0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
1a6b0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1a6c0 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65  , j, notReady, e
1a6d0 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
1a6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1a6f0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
1a700 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28      wsFlags |= (
1a710 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
1a720 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b  WHERE_ROWID_EQ);
1a730 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1a740 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1a750 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
1a760 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
1a770 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
1a780 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1a790 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
1a7a0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
1a7b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1a7c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1a7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1a7e0 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
1a7f0 2e 29 22 3a 20 20 41 73 73 75 6d 65 20 74 68 65  .)":  Assume the
1a800 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20   SELECT returns 
1a810 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  25 rows */.     
1a820 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32       nInMul *= 2
1a830 35 3b 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  5;.          bIn
1a840 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Est = 1;.       
1a850 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
1a860 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
1a870 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
1a880 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
1a890 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1a8a0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
1a8b0 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20  ...)" */.       
1a8c0 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78     nInMul *= pEx
1a8d0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1a8e0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
1a8f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1a900 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1a910 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
1a920 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1a930 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1a940 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  LL;.      }.#ifd
1a950 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a960 5f 53 54 41 54 32 0a 20 20 20 20 20 20 69 66 28  _STAT2.      if(
1a970 20 6e 45 71 3d 3d 30 20 26 26 20 70 50 72 6f 62   nEq==0 && pProb
1a980 65 2d 3e 61 53 61 6d 70 6c 65 20 29 20 70 46 69  e->aSample ) pFi
1a990 72 73 74 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b  rstTerm = pTerm;
1a9a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 75 73  .#endif.      us
1a9b0 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65  ed |= pTerm->pre
1a9c0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  reqRight;.    }.
1a9d0 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
1a9e0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  e the value of e
1a9f0 73 74 42 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  stBound. */.    
1aa00 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
1aa10 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
1aa20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
1aa30 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
1aa40 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
1aa50 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1aa60 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
1aa70 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
1aa80 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  GE, pIdx) ){.   
1aa90 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1aaa0 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28  pTop = findTerm(
1aab0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
1aac0 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1aad0 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _LE, pIdx);.    
1aae0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1aaf0 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Btm = findTerm(p
1ab00 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1ab10 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
1ab20 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  GE, pIdx);.     
1ab30 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
1ab40 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1ab50 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20  obe, nEq, pBtm, 
1ab60 70 54 6f 70 2c 20 26 65 73 74 42 6f 75 6e 64 29  pTop, &estBound)
1ab70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1ab80 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
1ab90 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20  nBound = 1;.    
1aba0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1abb0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1abc0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 64  ;.          used
1abd0 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71   |= pTop->prereq
1abe0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d  Right;.        }
1abf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
1ac00 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  m ){.          n
1ac10 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Bound++;.       
1ac20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1ac30 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
1ac40 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
1ac50 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69 67   pBtm->prereqRig
1ac60 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
1ac70 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1ac80 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
1ac90 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44  ANGE|WHERE_ROWID
1aca0 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d  _RANGE);.      }
1acb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1acc0 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
1acd0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
1ace0 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61   testcase( wsFla
1acf0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
1ad00 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  N_IN );.      te
1ad10 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
1ad20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
1ad30 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ULL );.      if(
1ad40 20 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45   (wsFlags & (WHE
1ad50 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1ad60 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29  RE_COLUMN_NULL))
1ad70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ==0 ){.        w
1ad80 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1ad90 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a  UNIQUE;.      }.
1ada0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1adb0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1adc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
1add0 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1ade0 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c   considered will
1adf0 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c  .    ** naturall
1ae00 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74  y scan rows in t
1ae10 68 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65  he required orde
1ae20 72 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f  r, set the appro
1ae30 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20  priate flags.   
1ae40 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20   ** in wsFlags. 
1ae50 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1ae60 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1ae70 42 59 20 63 6c 61 75 73 65 20 62 75 74 20 74 68  BY clause but th
1ae80 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77  e index.    ** w
1ae90 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e  ill scan rows in
1aea0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
1aeb0 65 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72  er, set the bSor
1aec0 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  t variable.  */.
1aed0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
1aee0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77   ){.      if( (w
1aef0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1af00 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20  OLUMN_IN)==0.   
1af10 20 20 20 20 20 26 26 20 69 73 53 6f 72 74 69 6e       && isSortin
1af20 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
1af30 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 50  WC->pMaskSet, pP
1af40 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 4f 72 64  robe, iCur, pOrd
1af50 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 6e 45 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72  nEq, wsFlags, &r
1af80 65 76 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ev).      ){.   
1af90 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1afa0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1afb0 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  E|WHERE_COLUMN_R
1afc0 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44 45 52  ANGE|WHERE_ORDER
1afd0 42 59 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c  BY;.        wsFl
1afe0 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57 48  ags |= (rev ? WH
1aff0 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30 29  ERE_REVERSE : 0)
1b000 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b010 20 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 31         bSort = 1
1b020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b030 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65  .    /* If curre
1b040 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67  ntly calculating
1b050 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69   the cost of usi
1b060 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74  ng an index (not
1b070 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20   the IPK.    ** 
1b080 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e  index), determin
1b090 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65  e if all require
1b0a0 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61  d column data ma
1b0b0 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69  y be obtained wi
1b0c0 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73  thout .    ** us
1b0d0 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62  ing the main tab
1b0e0 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  le (i.e. if the 
1b0f0 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72  index is a cover
1b100 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ing.    ** index
1b110 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29   for this query)
1b120 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1b130 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  the WHERE_IDX_ON
1b140 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a  LY flag in.    *
1b150 2a 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72  * wsFlags. Other
1b160 77 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c  wise, set the bL
1b170 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74  ookup variable t
1b180 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20  o true.  */.    
1b190 69 66 28 20 70 49 64 78 20 26 26 20 77 73 46 6c  if( pIdx && wsFl
1b1a0 61 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69 74  ags ){.      Bit
1b1b0 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
1b1c0 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
1b1d0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
1b1e0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
1b1f0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
1b200 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
1b210 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1b220 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
1b230 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
1b240 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
1b250 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
1b260 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b270 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
1b280 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1b290 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
1b2a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b2b0 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b      bLookup = 1;
1b2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b2d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73      /*.    ** Es
1b2e0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1b2f0 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74  r of rows of out
1b300 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20  put.  For an "x 
1b310 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a  IN (SELECT...)".
1b320 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1b330 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  t, do not let th
1b340 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65  e estimate excee
1b350 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20  d half the rows 
1b360 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  in the table..  
1b370 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20    */.    nRow = 
1b380 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73  (double)(aiRowEs
1b390 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29  t[nEq] * nInMul)
1b3a0 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74  ;.    if( bInEst
1b3b0 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77   && nRow*2>aiRow
1b3c0 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Est[0] ){.      
1b3d0 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b  nRow = aiRowEst[
1b3e0 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d  0]/2;.      nInM
1b3f0 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20  ul = (int)(nRow 
1b400 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29  / aiRowEst[nEq])
1b410 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1b420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1b430 41 54 32 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  AT2.    /* If th
1b440 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
1b450 6f 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41  of the form x=VA
1b460 4c 55 45 20 61 6e 64 20 68 69 73 74 6f 67 72 61  LUE and histogra
1b470 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73  m.    ** data is
1b480 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 63   available for c
1b490 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74  olumn x, then it
1b4a0 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
1b4b0 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74  le.    ** to get
1b4c0 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d 61   a better estima
1b4d0 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  te on the number
1b4e0 20 6f 66 20 72 6f 77 73 20 62 61 73 65 64 20 6f   of rows based o
1b4f0 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55 45 20 61  n.    ** VALUE a
1b500 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68  nd how common th
1b510 61 74 20 76 61 6c 75 65 20 69 73 20 61 63 63 6f  at value is acco
1b520 72 64 69 6e 67 20 74 6f 20 74 68 65 20 68 69 73  rding to the his
1b530 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20  togram..    */. 
1b540 20 20 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75     if( nRow>(dou
1b550 62 6c 65 29 31 20 26 26 20 6e 45 71 3d 3d 31 20  ble)1 && nEq==1 
1b560 26 26 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30  && pFirstTerm!=0
1b570 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46   ){.      if( pF
1b580 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1b590 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1b5a0 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
1b5b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69     testcase( pFi
1b5c0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1b5d0 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
1b5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b5f0 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1b600 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
1b610 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1b620 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
1b630 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69  rse, pProbe, pFi
1b640 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  rstTerm->pExpr->
1b650 70 52 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a  pRight, &nRow);.
1b660 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b670 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65  pFirstTerm->eOpe
1b680 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 26 26 20  rator==WO_IN && 
1b690 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bInEst==0 ){.   
1b6a0 20 20 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e       whereInScan
1b6b0 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1b6c0 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1b6d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1b6e0 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  &nRow);.      }.
1b6f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1b700 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1b710 41 54 32 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  AT2 */..    /* A
1b720 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72  djust the number
1b730 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
1b740 61 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  and downward to 
1b750 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
1b760 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
1b770 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
1b780 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1b790 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e  */.    nRow = (n
1b7a0 52 6f 77 20 2a 20 28 64 6f 75 62 6c 65 29 65 73  Row * (double)es
1b7b0 74 42 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c  tBound) / (doubl
1b7c0 65 29 31 30 30 3b 0a 20 20 20 20 69 66 28 20 6e  e)100;.    if( n
1b7d0 52 6f 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31  Row<1 ) nRow = 1
1b7e0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69  ;..    /* Experi
1b7f0 6d 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61  ments run on rea
1b800 6c 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  l SQLite databas
1b810 65 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  es show that the
1b820 20 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20   time needed.   
1b830 20 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61   ** to do a bina
1b840 72 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63  ry search to loc
1b850 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74  ate a row in a t
1b860 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
1b870 20 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20   roughly.    ** 
1b880 6c 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74  log10(N) times t
1b890 68 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20  he time to move 
1b8a0 66 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20  from one row to 
1b8b0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74  the next row wit
1b8c0 68 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  hin.    ** a tab
1b8d0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68  le or index.  Th
1b8e0 65 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63  e actual times c
1b8f0 61 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68  an vary, with th
1b900 65 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  e size of.    **
1b910 20 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61   records being a
1b920 6e 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74  n important fact
1b930 6f 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20  or.  Both moves 
1b940 61 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65  and searches are
1b950 0a 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77  .    ** slower w
1b960 69 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72  ith larger recor
1b970 64 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62  ds, presumably b
1b980 65 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63  ecause fewer rec
1b990 6f 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20  ords fit.    ** 
1b9a0 6f 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20  on one page and 
1b9b0 68 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73  hence more pages
1b9c0 20 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63   have to be fetc
1b9d0 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1b9e0 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63  ** The ANALYZE c
1b9f0 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73  ommand and the s
1ba00 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20  qlite_stat1 and 
1ba10 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62  sqlite_stat2 tab
1ba20 6c 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  les do.    ** no
1ba30 74 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f  t give us data o
1ba40 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
1ba50 69 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e  izes of table an
1ba60 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
1ba70 0a 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20  .    ** So this 
1ba80 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75  computation assu
1ba90 6d 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64  mes table record
1baa0 73 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63  s are about twic
1bab0 65 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20  e as big.    ** 
1bac0 61 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  as index records
1bad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bae0 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
1baf0 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
1bb00 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1bb10 65 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c  e cost of a full
1bb20 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61   table scan is a
1bb30 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20   number of move 
1bb40 6f 70 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c  operations equal
1bb50 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
1bb60 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1bb70 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  in the table..  
1bb80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1bb90 57 65 20 61 64 64 20 61 6e 20 61 64 64 69 74 69  We add an additi
1bba0 6f 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20  onal 4x penalty 
1bbb0 74 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  to full table sc
1bbc0 61 6e 73 2e 20 20 54 68 69 73 20 63 61 75 73 65  ans.  This cause
1bbd0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  s.      ** the c
1bbe0 6f 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ost function to 
1bbf0 65 72 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20  err on the side 
1bc00 6f 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69  of choosing an i
1bc10 6e 64 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20  ndex over.      
1bc20 2a 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75  ** choosing a fu
1bc30 6c 6c 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34  ll scan.  This 4
1bc40 78 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61  x full-scan pena
1bc50 6c 74 79 20 69 73 20 61 6e 20 61 72 67 75 61 62  lty is an arguab
1bc60 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69  le.      ** deci
1bc70 73 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69  sion and one whi
1bc80 63 68 20 77 65 20 65 78 70 65 63 74 20 74 6f 20  ch we expect to 
1bc90 72 65 76 69 73 69 74 20 69 6e 20 74 68 65 20 66  revisit in the f
1bca0 75 74 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20  uture.  But.    
1bcb0 20 20 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f    ** it seems to
1bcc0 20 62 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c   be working well
1bcd0 20 65 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d   enough at the m
1bce0 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  oment..      */.
1bcf0 20 20 20 20 20 20 63 6f 73 74 20 3d 20 61 69 52        cost = aiR
1bd00 6f 77 45 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20  owEst[0]*4;.    
1bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67  }else{.      log
1bd20 31 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52  10N = estLog(aiR
1bd30 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  owEst[0]);.     
1bd40 20 63 6f 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20   cost = nRow;.  
1bd50 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
1bd60 20 20 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f          if( bLoo
1bd70 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kup ){.         
1bd80 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78   /* For an index
1bd90 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64   lookup followed
1bda0 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   by a table look
1bdb0 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  up:.          **
1bdc0 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78      nInMul index
1bdd0 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e   searches to fin
1bde0 64 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  d the start of e
1bdf0 61 63 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a  ach index range.
1be00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20            **  + 
1be10 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75  nRow steps throu
1be20 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  gh the index.   
1be30 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f         **  + nRo
1be40 77 20 74 61 62 6c 65 20 73 65 61 72 63 68 65 73  w table searches
1be50 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74   to lookup the t
1be60 61 62 6c 65 20 65 6e 74 72 79 20 75 73 69 6e 67  able entry using
1be70 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20   the rowid.     
1be80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1be90 20 20 63 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75    cost += (nInMu
1bea0 6c 20 2b 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e  l + nRow)*log10N
1beb0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bec0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
1bed0 72 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  r a covering ind
1bee0 65 78 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex:.          **
1bef0 20 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65       nInMul inde
1bf00 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69  x searches to fi
1bf10 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65  nd the initial e
1bf20 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 20 20  ntry .          
1bf30 2a 2a 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70  **   + nRow step
1bf40 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  s through the in
1bf50 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  dex.          */
1bf60 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
1bf70 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e  += nInMul*log10N
1bf80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bf90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bfa0 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20   /* For a rowid 
1bfb0 70 72 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b  primary key look
1bfc0 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  up:.        **  
1bfd0 20 20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20    nInMult table 
1bfe0 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1bff0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1c000 72 79 20 66 6f 72 20 65 61 63 68 20 72 61 6e 67  ry for each rang
1c010 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20  e.        **  + 
1c020 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75  nRow steps throu
1c030 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  gh the table.   
1c040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c050 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  cost += nInMul*l
1c060 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  og10N;.      }. 
1c070 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1c080 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
1c090 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
1c0a0 67 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41  g the result.  A
1c0b0 63 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74  ctual experiment
1c0c0 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  al.    ** measur
1c0d0 65 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e  ements of sortin
1c0e0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e  g performance in
1c0f0 20 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61   SQLite show tha
1c100 74 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20  t sorting time. 
1c110 20 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c     ** adds C*N*l
1c120 6f 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63  og10(N) to the c
1c130 6f 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ost, where N is 
1c140 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1c150 77 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ws to be .    **
1c160 20 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73   sorted and C is
1c170 20 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65   a factor betwee
1c180 6e 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20  n 1.95 and 4.3. 
1c190 20 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74   We will split t
1c1a0 68 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72  he.    ** differ
1c1b0 65 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20  ence and select 
1c1c0 43 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f  C of 3.0..    */
1c1d0 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
1c1e0 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
1c1f0 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
1c200 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  )*3;.    }..    
1c210 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73  /**** Cost of us
1c220 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68  ing this index h
1c230 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70  as now been comp
1c240 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20  uted ****/..    
1c250 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1c260 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
1c270 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74  raints on this t
1c280 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  able that cannot
1c290 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20  .    ** be used 
1c2a0 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
1c2b0 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63   index, but whic
1c2c0 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68  h might lower th
1c2d0 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  e number.    ** 
1c2e0 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
1c2f0 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20  adjust the nRow 
1c300 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c  value accordingl
1c310 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20  y.  This only . 
1c320 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66     ** matters if
1c330 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
1c340 65 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20  ex is the least 
1c350 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f  costly, so do no
1c360 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  t bother.    ** 
1c370 77 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69  with this step i
1c380 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f  f we already kno
1c390 77 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c  w this index wil
1c3a0 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e  l not be chosen.
1c3b0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65  .    ** Also, ne
1c3c0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f  ver reduce the o
1c3d0 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20  utput row count 
1c3e0 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68  below 2 using th
1c3f0 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a  is step..    **.
1c400 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69      ** It is cri
1c410 74 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e  tical that the n
1c420 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20  otValid mask be 
1c430 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1c440 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  d of.    ** the 
1c450 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20  notReady mask.  
1c460 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  When computing a
1c470 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65  n "optimal" inde
1c480 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a  x, the notReady.
1c490 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c      ** mask will
1c4a0 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62   only have one b
1c4b0 69 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74  it set - the bit
1c4c0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1c4d0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
1c4e0 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1c4f0 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  , on the other h
1c500 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20  and, always has 
1c510 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72  all bits set for
1c520 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
1c530 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f  hat are not in o
1c540 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20  uter loops.  If 
1c550 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64  notReady is used
1c560 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20   here instead.  
1c570 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64    ** of notValid
1c580 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c  , then a optimal
1c590 20 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65   index that depe
1c5a0 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69  nds on inner joi
1c5b0 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20  ns loops.    ** 
1c5c0 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65  might be selecte
1c5d0 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  d even when ther
1c5e0 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69  e exists an opti
1c5f0 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  mal index that h
1c600 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63  as.    ** no suc
1c610 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20  h dependency..  
1c620 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f    */.    if( nRo
1c630 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70 43 6f  w>2 && cost<=pCo
1c640 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
1c650 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1c680 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
1c690 69 70 45 71 20 3d 20 6e 45 71 3b 20 20 20 20 20  ipEq = nEq;     
1c6a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c6b0 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  of == constraint
1c6c0 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20  s to skip */.   
1c6d0 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67     int nSkipRang
1c6e0 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20  e = nBound;     
1c6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63  /* Number of < c
1c700 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
1c710 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d  ip */.      Bitm
1c720 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20  ask thisTab;    
1c730 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
1c740 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a  ap for pSrc */..
1c750 20 20 20 20 20 20 74 68 69 73 54 61 62 20 3d 20        thisTab = 
1c760 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
1c770 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1c780 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1c790 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
1c7a0 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b 3b  rm; nRow>2 && k;
1c7b0 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
1c7c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1c7d0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1c7e0 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74  M_VIRTUAL ) cont
1c7f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1c800 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1c810 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29 21  All & notValid)!
1c820 3d 74 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69  =thisTab ) conti
1c830 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1c840 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1c850 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e  r & (WO_EQ|WO_IN
1c860 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  |WO_ISNULL) ){. 
1c870 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
1c880 69 70 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ipEq ){.        
1c890 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
1c8a0 65 20 66 69 72 73 74 20 6e 45 71 20 65 71 75 61  e first nEq equa
1c8b0 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e  lity matches sin
1c8c0 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ce the index.   
1c8d0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
1c8e0 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65  already accounte
1c8f0 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20  d for these */. 
1c900 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70             nSkip
1c910 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  Eq--;.          
1c920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c930 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63     /* Assume eac
1c940 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75  h additional equ
1c950 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75  ality match redu
1c960 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
1c970 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
1c980 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
1c990 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20  or of 10 */.    
1c9a0 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20          nRow /= 
1c9b0 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
1c9c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c9d0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1c9e0 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
1c9f0 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29  E|WO_GT|WO_GE) )
1ca00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ca10 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20  nSkipRange ){.  
1ca20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
1ca30 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ore the first nS
1ca40 6b 69 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63  kipRange range c
1ca50 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65  onstraints since
1ca60 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1ca70 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
1ca80 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20  ready accounted 
1ca90 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20  for these */.   
1caa0 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61           nSkipRa
1cab0 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  nge--;.         
1cac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cad0 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61      /* Assume ea
1cae0 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61  ch additional ra
1caf0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  nge constraint r
1cb00 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c  educes the resul
1cb10 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
1cb20 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66   set size by a f
1cb30 61 63 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64  actor of 3.  Ind
1cb40 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  exed range const
1cb50 72 61 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20  raints reduce.  
1cb60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1cb70 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
1cb80 20 61 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72   a larger factor
1cb90 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e  : 4.  We make in
1cba0 64 65 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20  dexed range.    
1cbb0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20          ** more 
1cbc0 73 65 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74  selective intent
1cbd0 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20  ionally because 
1cbe0 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 69 76  of the subjectiv
1cbf0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
1cc00 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68  * observation th
1cc10 61 74 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65  at indexed range
1cc20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61   constraints rea
1cc30 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20  lly are more.   
1cc40 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65           ** sele
1cc50 63 74 69 76 65 20 69 6e 20 70 72 61 63 74 69 63  ctive in practic
1cc60 65 2c 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a  e, on average. *
1cc70 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1cc80 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  ow /= 3;.       
1cc90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1cca0 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
1ccb0 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50  perator!=WO_NOOP
1ccc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1ccd0 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
1cce0 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65  ssion lowers the
1ccf0 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
1cd00 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20  t by half */.   
1cd10 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 32         nRow /= 2
1cd20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cd30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 52    }.      if( nR
1cd40 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32 3b  ow<2 ) nRow = 2;
1cd50 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45  .    }...    WHE
1cd60 52 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20  RETRACE((.      
1cd70 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25 64 20  "%s(%s): nEq=%d 
1cd80 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74 42 6f 75  nInMul=%d estBou
1cd90 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62  nd=%d bSort=%d b
1cda0 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67  Lookup=%d wsFlag
1cdb0 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20 20 20  s=0x%x\n".      
1cdc0 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61  "         notRea
1cdd0 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e  dy=0x%llx log10N
1cde0 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20  =%.1f nRow=%.1f 
1cdf0 63 6f 73 74 3d 25 2e 31 66 20 75 73 65 64 3d 30  cost=%.1f used=0
1ce00 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  x%llx\n",.      
1ce10 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1ce20 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
1ce30 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
1ce40 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
1ce50 4d 75 6c 2c 20 65 73 74 42 6f 75 6e 64 2c 20 62  Mul, estBound, b
1ce60 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77  Sort, bLookup, w
1ce70 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f  sFlags,.      no
1ce80 74 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20  tReady, log10N, 
1ce90 6e 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64  nRow, cost, used
1cea0 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a  .    ));..    /*
1ceb0 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   If this index i
1cec0 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61  s the best we ha
1ced0 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20  ve seen so far, 
1cee0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73  then record this
1cef0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e  .    ** index an
1cf00 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68  d its cost in th
1cf10 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75 72  e pCost structur
1cf20 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1cf30 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c  ( (!pIdx || wsFl
1cf40 61 67 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f  ags).     && (co
1cf50 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  st<pCost->rCost 
1cf60 7c 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d  || (cost<=pCost-
1cf70 3e 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70  >rCost && nRow<p
1cf80 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29  Cost->plan.nRow)
1cf90 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1cfa0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f  Cost->rCost = co
1cfb0 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  st;.      pCost-
1cfc0 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20  >used = used;.  
1cfd0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1cfe0 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nRow = nRow;.   
1cff0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
1d000 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67  sFlags = (wsFlag
1d010 73 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20  s&wsFlagMask);. 
1d020 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1d030 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  .nEq = nEq;.    
1d040 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
1d050 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  pIdx = pIdx;.   
1d060 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d070 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
1d080 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
1d090 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
1d0a0 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
1d0b0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
1d0c0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
1d0d0 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ndex ) break;.. 
1d0e0 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b     /* Reset mask
1d0f0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  s for the next i
1d100 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70  ndex in the loop
1d110 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61   */.    wsFlagMa
1d120 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
1d130 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1d140 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
1d150 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
1d160 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20  TermMask;.  }.. 
1d170 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1d180 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
1d190 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54  se and the SQLIT
1d1a0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66  E_ReverseOrder f
1d1b0 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c  lag.  ** is set,
1d1c0 20 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68   then reverse th
1d1d0 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65  e order that the
1d1e0 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73   index will be s
1d1f0 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20  canned.  ** in. 
1d200 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
1d210 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73   application tes
1d220 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69  ting, to help fi
1d230 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68  nd cases.  ** wh
1d240 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ere application 
1d250 62 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64  behaviour depend
1d260 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69  s on the (undefi
1d270 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a  ned) order that.
1d280 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70    ** SQLite outp
1d290 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74  uts rows in in t
1d2a0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e  he absence of an
1d2b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d2c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72  .  */.  if( !pOr
1d2d0 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d  derBy && pParse-
1d2e0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1d2f0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
1d300 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70   ){.    pCost->p
1d310 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
1d320 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
1d330 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  }..  assert( pOr
1d340 64 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d  derBy || (pCost-
1d350 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
1d360 45 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20  ERE_ORDERBY)==0 
1d370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
1d380 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  st->plan.u.pIdx=
1d390 3d 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c  =0 || (pCost->pl
1d3a0 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
1d3b0 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b  _ROWID_EQ)==0 );
1d3c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
1d3d0 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20  >pIndex==0 .    
1d3e0 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61     || pCost->pla
1d3f0 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20  n.u.pIdx==0 .   
1d400 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c      || pCost->pl
1d410 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d  an.u.pIdx==pSrc-
1d420 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20  >pIndex .  );.. 
1d430 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
1d440 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c  st index is: %s\
1d450 6e 22 2c 20 0a 20 20 20 20 28 28 70 43 6f 73 74  n", .    ((pCost
1d460 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d470 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
1d480 43 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22  CAN)==0 ? "none"
1d490 20 3a 20 0a 20 20 20 20 20 20 20 20 20 70 43 6f   : .         pCo
1d4a0 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20  st->plan.u.pIdx 
1d4b0 3f 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e  ? pCost->plan.u.
1d4c0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69  pIdx->zName : "i
1d4d0 70 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20  pk").  ));.  .  
1d4e0 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
1d4f0 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
1d500 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
1d510 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42  otValid, pOrderB
1d520 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62 65 73  y, pCost);.  bes
1d530 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
1d540 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1d550 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f  c, notReady, pCo
1d560 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  st);.  pCost->pl
1d570 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71  an.wsFlags |= eq
1d580 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  TermMask;.}../*.
1d590 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72  ** Find the quer
1d5a0 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73  y plan for acces
1d5b0 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d  sing table pSrc-
1d5c0 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68 65  >pTab. Write the
1d5d0 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70  .** best query p
1d5e0 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74  lan and its cost
1d5f0 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43   into the WhereC
1d600 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c  ost object suppl
1d610 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c  ied .** as the l
1d620 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54  ast parameter. T
1d630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
1d640 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63   calculate the c
1d650 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72  ost of.** both r
1d660 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20  eal and virtual 
1d670 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a  table scans..*/.
1d680 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
1d690 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
1d6a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1d6b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1d6c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d6d0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1d6e0 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
1d6f0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1d700 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d710 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
1d720 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1d730 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1d740 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
1d750 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
1d760 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1d770 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
1d780 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69  lable for indexi
1d790 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
1d7a0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
1d7b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
1d7c0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
1d7d0 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
1d7e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1d7f0 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
1d800 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1d810 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
1d820 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
1d830 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
1d840 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
1d850 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
1d860 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1d870 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
1d880 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
1d890 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
1d8a0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20  3_index_info *p 
1d8b0 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72  = 0;.    bestVir
1d8c0 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
1d8d0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1d8e0 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
1d8f0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
1d900 2c 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ,&p);.    if( p-
1d910 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1d920 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
1d930 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74  e3_free(p->idxSt
1d940 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1d950 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1d960 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65  se->db, p);.  }e
1d970 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1d980 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
1d990 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
1d9a0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
1d9b0 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42  otValid, pOrderB
1d9c0 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d  y, pCost);.  }.}
1d9d0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
1d9e0 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
1d9f0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
1da00 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
1da10 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
1da20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
1da30 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1da40 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
1da50 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
1da60 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
1da70 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
1da80 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
1da90 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
1daa0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
1dab0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
1dac0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
1dad0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
1dae0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
1daf0 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
1db00 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
1db10 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
1db20 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1db30 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
1db40 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
1db50 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
1db60 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
1db70 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
1db80 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
1db90 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
1dba0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
1dbb0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
1dbc0 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
1dbd0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
1dbe0 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
1dbf0 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
1dc00 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
1dc10 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
1dc20 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
1dc30 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
1dc40 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
1dc50 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
1dc60 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35  TATION-OF: R-245
1dc70 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74  97-58655 No test
1dc80 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74  s are done for t
1dc90 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a  erms that are.**
1dca0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69   completely sati
1dcb0 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73  sfied by indices
1dcc0 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
1dcd0 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
1dce0 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
1dcf0 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
1dd00 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
1dd10 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
1dd20 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
1dd30 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
1dd40 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
1dd50 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
1dd60 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
1dd70 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
1dd80 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
1dd90 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
1dda0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
1ddb0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
1ddc0 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
1ddd0 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
1dde0 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
1ddf0 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
1de00 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
1de10 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
1de20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
1de30 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
1de40 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
1de50 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
1de60 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
1de70 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
1de80 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
1de90 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
1dea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1deb0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
1dec0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1ded0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1dee0 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
1def0 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1df00 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1df10 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
1df20 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
1df30 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
1df40 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
1df50 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
1df60 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
1df70 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
1df80 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
1df90 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
1dfa0 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
1dfb0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
1dfc0 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
1dfd0 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
1dfe0 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
1dff0 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
1e000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e010 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1e020 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
1e030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1e040 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
1e050 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
1e060 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
1e070 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
1e080 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
1e090 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
1e0a0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
1e0b0 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
1e0c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
1e0d0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
1e0e0 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
1e0f0 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
1e100 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
1e110 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
1e120 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
1e130 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
1e140 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
1e150 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
1e160 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
1e170 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
1e180 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1e190 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
1e1a0 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
1e1b0 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
1e1c0 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
1e1d0 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
1e1e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
1e1f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1e200 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1e210 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1e220 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
1e230 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
1e240 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e250 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
1e260 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
1e270 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1e280 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e290 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1e2a0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1e2b0 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
1e2c0 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
1e2d0 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
1e2e0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
1e2f0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1e300 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
1e310 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
1e320 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
1e330 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
1e340 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
1e350 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
1e360 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
1e370 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
1e380 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
1e390 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
1e3a0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
1e3b0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
1e3c0 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
1e3d0 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
1e3e0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
1e3f0 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
1e400 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
1e410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e420 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1e430 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
1e440 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1e450 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
1e460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1e470 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1e480 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
1e490 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
1e4a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1e4b0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
1e4c0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
1e4d0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1e4e0 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
1e4f0 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
1e500 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
1e510 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
1e520 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
1e530 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
1e540 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
1e550 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
1e560 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
1e570 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
1e580 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
1e590 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
1e5a0 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
1e5b0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
1e5c0 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
1e5d0 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
1e5e0 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
1e5f0 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
1e600 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
1e610 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
1e620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
1e630 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
1e640 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
1e650 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
1e660 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
1e670 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
1e680 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1e690 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
1e6a0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1e6b0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
1e6c0 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
1e6d0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
1e6e0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
1e6f0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
1e700 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1e710 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
1e720 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e730 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1e740 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  on */.  int iTar
1e750 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
1e760 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
1e770 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
1e780 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1e790 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
1e7a0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
1e7b0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e7c0 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1e7f0 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
1e800 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
1e810 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
1e820 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
1e830 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1e840 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1e850 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1e860 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1e870 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
1e880 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
1e890 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
1e8a0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
1e8b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e8c0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
1e8d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e8e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
1e8f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
1e900 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
1e910 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
1e920 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20  Loop *pIn;..    
1e930 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
1e940 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65  TK_IN );.    iRe
1e950 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
1e960 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
1e970 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
1e980 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20  se, pX, 0);.    
1e990 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
1e9a0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1e9b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1e9c0 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
1e9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1e9e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1e9f0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
1ea00 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
1ea10 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
1ea20 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1ea30 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1ea40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ea50 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
1ea60 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
1ea70 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
1ea80 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
1ea90 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
1eaa0 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
1eab0 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
1eac0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1eaf0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
1eb00 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
1eb10 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
1eb20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
1eb30 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
1eb40 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
1eb50 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
1eb60 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
1eb70 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
1eb80 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
1eb90 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1eba0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1ebb0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
1ebc0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1ebd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1ebe0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
1ebf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ec00 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
1ec10 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
1ec20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1ec30 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
1ec40 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
1ec50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ec60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
1ec70 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  ull, iReg);.    
1ec80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1ec90 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20  vel->u.in.nIn = 
1eca0 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
1ecb0 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
1ecc0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
1ecd0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  ;.  return iReg;
1ece0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ecf0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1ed00 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
1ed10 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
1ed20 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
1ed30 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ndex..**.** For 
1ed40 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
1ed50 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
1ed60 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
1ed70 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
1ed80 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
1ed90 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
1eda0 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
1edb0 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
1edc0 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
1edd0 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
1ede0 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
1edf0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ee00 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
1ee10 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
1ee20 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
1ee30 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
1ee40 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
1ee50 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
1ee60 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
1ee70 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
1ee80 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
1ee90 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
1eea0 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
1eeb0 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
1eec0 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
1eed0 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a  will be stored.*
1eee0 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65  * in consecutive
1eef0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
1ef00 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1ef10 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
1ef20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1ef30 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
1ef40 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20   above nEq==2.  
1ef50 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74  But this subrout
1ef60 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
1ef70 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45  y value.** of nE
1ef80 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20  q including 0.  
1ef90 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20  If nEq==0, this 
1efa0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c  routine is nearl
1efb0 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  y a no-op..** Th
1efc0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20  e only thing it 
1efd0 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65  does is allocate
1efe0 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   the pLevel->iMe
1eff0 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  m memory cell an
1f000 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65  d.** compute the
1f010 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1f020 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f030 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f  tine always allo
1f040 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f  cates at least o
1f050 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  ne memory cell a
1f060 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  nd returns.** th
1f070 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
1f080 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65  memory cell. The
1f090 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
1f0a0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1f0b0 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
1f0c0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74  emory cell to st
1f0d0 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
1f0e0 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
1f0f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
1f100 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
1f110 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
1f120 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
1f130 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
1f140 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
1f150 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
1f160 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
1f170 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
1f180 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
1f190 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
1f1a0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
1f1b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1f1c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
1f1d0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
1f1e0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
1f1f0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1f200 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
1f210 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
1f220 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
1f230 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
1f240 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
1f250 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
1f260 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
1f270 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
1f280 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
1f290 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
1f2a0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
1f2b0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
1f2c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1f2d0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
1f2e0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
1f2f0 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
1f300 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
1f310 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
1f320 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
1f330 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
1f340 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
1f350 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
1f360 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
1f370 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
1f380 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
1f390 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
1f3a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1f3b0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
1f3c0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
1f3d0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
1f3e0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
1f3f0 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
1f400 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
1f410 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
1f420 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
1f430 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
1f440 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
1f450 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
1f460 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
1f470 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
1f480 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
1f490 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
1f4a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
1f4b0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
1f4c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f4d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
1f4e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1f4f0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1f500 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
1f510 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
1f520 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
1f530 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
1f540 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
1f550 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1f560 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
1f570 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
1f580 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
1f590 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
1f5a0 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
1f5b0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
1f5c0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
1f5d0 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
1f5e0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
1f5f0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
1f600 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
1f610 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
1f620 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
1f630 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
1f640 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
1f650 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54  plan.nEq;   /* T
1f660 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
1f670 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
1f680 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56  s to code */.  V
1f690 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f6a0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1f6b0 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
1f6c0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
1f6d0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6f0 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
1f700 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
1f710 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  op */.  int iCur
1f720 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
1f730 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur;   /* The cur
1f740 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
1f750 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1f760 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1f770 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
1f780 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
1f790 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1f7c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1f7d0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1f7e0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1f7f0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1f800 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f820 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1f830 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1f840 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1f870 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1f880 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1f890 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1f8a0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1f8b0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1f8c0 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  x. */.  assert( 
1f8d0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f8e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
1f8f0 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d  EXED );.  pIdx =
1f900 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1f910 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  pIdx;..  /* Figu
1f920 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1f930 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
1f940 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
1f950 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
1f960 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
1f970 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1f980 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c  .  nReg = pLevel
1f990 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78  ->plan.nEq + nEx
1f9a0 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
1f9b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
1f9c0 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
1f9d0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
1f9e0 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64  ->db, sqlite3Ind
1f9f0 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
1fa00 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21   pIdx));.  if( !
1fa10 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72  zAff ){.    pPar
1fa20 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1fa30 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iled = 1;.  }.. 
1fa40 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
1fa50 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1fa60 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
1fa70 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
1fa80 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
1fa90 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
1faa0 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
1fab0 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
1fac0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1fad0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
1fae0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
1faf0 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
1fb00 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c  l->plan.wsFlags,
1fb10 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
1fb20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20  NEVER(pTerm==0) 
1fb30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20  ) break;.    /* 
1fb40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72  The following tr
1fb50 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
1fb60 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
1fb70 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
1fb80 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
1fb90 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
1fba0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fbb0 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
1fbc0 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
1fbd0 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
1fbe0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1fbf0 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
1fc00 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1fc10 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1fc20 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
1fc30 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
1fc40 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
1fc50 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1fc60 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1fc70 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1fc80 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
1fc90 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
1fca0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
1fcb0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1fcc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1fcd0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1fce0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
1fcf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1fd00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fd10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1fd20 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
1fd30 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
1fd40 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
1fd50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1fd60 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1fd70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1fd80 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fd90 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1fda0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1fdb0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
1fdc0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
1fdd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1fde0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
1fdf0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1fe00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1fe10 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1fe20 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
1fe30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1fe40 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
1fe50 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1fe60 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1fe70 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1fe80 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
1fe90 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1fea0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1feb0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1fec0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1fed0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1fee0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1fef0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1ff00 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
1ff10 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1ff20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1ff30 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1ff40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ff50 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
1ff60 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
1ff70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1ff80 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1ff90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ffa0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
1ffb0 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
1ffc0 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
1ffd0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
1ffe0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
1fff0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
20000 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
20010 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
20020 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
20030 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
20040 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
20050 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20060 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
20070 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
20080 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
20090 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
200a0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
200b0 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
200c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
200d0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
200e0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
200f0 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
20100 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
20110 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
20120 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
20130 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
20140 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
20150 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
20160 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
20170 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
20180 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
20190 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
201a0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
201b0 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
201c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
201d0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
201e0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
201f0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
20200 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
20210 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
20220 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
20230 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
20240 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
20250 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
20260 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
20270 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
20280 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
20290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
202a0 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
202b0 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
202c0 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
202d0 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
202e0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
202f0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
20300 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
20310 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
20320 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
20330 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
20340 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
20350 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
20360 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
20370 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
20380 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
20390 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
203a0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
203b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
203c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
203d0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
203e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
203f0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
20400 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
20410 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
20420 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
20430 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
20440 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
20450 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
20460 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
20470 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
20480 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
20490 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
204a0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
204b0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
204c0 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
204d0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
204e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
204f0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
20500 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
20510 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
20520 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
20530 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
20540 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
20550 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  b, WhereLevel *p
20560 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54  Level, Table *pT
20570 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e  ab){.  WherePlan
20580 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65   *pPlan = &pLeve
20590 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78  l->plan;.  Index
205a0 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e   *pIndex = pPlan
205b0 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20  ->u.pIdx;.  int 
205c0 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71  nEq = pPlan->nEq
205d0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
205e0 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
205f0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->aCol;.  int
20600 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
20610 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
20620 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
20630 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
20640 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20  (pPlan->wsFlags 
20650 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
20660 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
20670 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
20680 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
20690 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
206a0 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
206b0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
206c0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
206d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
206e0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
206f0 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
20700 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
20710 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
20720 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
20730 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
20740 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a  ]].zName, "=");.
20750 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
20760 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61  if( pPlan->wsFla
20770 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
20780 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  IT ){.    explai
20790 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
207a0 2c 20 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69 43 6f  , i++, aCol[aiCo
207b0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20  lumn[j]].zName, 
207c0 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
207d0 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
207e0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
207f0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
20800 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
20810 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
20820 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29 3b 0a  ]].zName, "<");.
20830 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
20840 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
20850 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
20860 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
20870 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
20880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20890 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
208a0 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
208b0 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
208c0 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
208d0 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
208e0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
208f0 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
20900 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
20910 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
20920 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
20930 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
20940 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
20950 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
20960 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
20970 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
20980 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
20990 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
209a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
209b0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
209c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
209d0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
209e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
209f0 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
20a00 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
20a10 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
20a20 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
20a30 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
20a40 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
20a50 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
20a60 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a80 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
20a90 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
20aa0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
20ab0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
20ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20ad0 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
20ae0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
20af0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
20b00 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
20b10 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
20b20 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
20b30 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
20b40 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
20b50 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
20b60 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76  u32 flags = pLev
20b70 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
20b80 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
20b90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20ba0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
20bb0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
20bc0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
20bd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
20be0 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
20bf0 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
20c00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20c10 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
20c20 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
20c30 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
20c40 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
20c50 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
20c60 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
20c70 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  put */.    sqlit
20c80 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20  e3_int64 nRow;  
20c90 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
20ca0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  cted number of r
20cb0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 73  ows visited by s
20cc0 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  can */.    int i
20cd0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
20ce0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
20cf0 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
20d00 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
20d10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
20d20 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
20d30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
20d40 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
20d50 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20   for SCAN. */.. 
20d60 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
20d70 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
20d80 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
20d90 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
20da0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
20db0 20 69 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65   isSearch = (pLe
20dc0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29  vel->plan.nEq>0)
20dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
20de0 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
20df0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
20e00 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
20e10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
20e20 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
20e30 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
20e40 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
20e50 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
20e60 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
20e70 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
20e80 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
20e90 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
20ea0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
20eb0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
20ec0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
20ed0 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
20ee0 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
20ef0 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
20f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
20f10 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
20f20 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
20f30 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
20f40 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
20f50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
20f60 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
20f70 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
20f80 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
20f90 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
20fa0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
20fb0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
20fc0 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
20fd0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
20fe0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
20ff0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
21000 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
21010 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d  b, pLevel, pItem
21020 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
21030 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
21040 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
21050 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e  "%s USING %s%sIN
21060 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67  DEX%s%s%s", zMsg
21070 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  , .          ((f
21080 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
21090 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41  P_INDEX)?"AUTOMA
210a0 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  TIC ":""),.     
210b0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
210c0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22  HERE_IDX_ONLY)?"
210d0 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a  COVERING ":""),.
210e0 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
210f0 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
21100 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20  NDEX)?"":" "),. 
21110 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
21120 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
21130 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d  DEX)?"": pLevel-
21140 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
21150 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
21160 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
21170 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
21180 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
21190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
211a0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
211b0 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
211c0 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
211d0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
211e0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
211f0 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
21200 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
21210 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
21220 20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52    if( flags&WHER
21230 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
21240 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
21250 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
21260 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
21270 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
21280 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
21290 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
212a0 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
212b0 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
212c0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
212d0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
212e0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
212f0 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
21300 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
21310 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
21320 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
21330 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
21340 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
21350 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
21360 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
21370 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21380 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
21390 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
213a0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
213b0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
213c0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29  g, "%s (rowid<?)
213d0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
213e0 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
213f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
21400 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
21410 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
21420 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
21430 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)!=0 ){.      s
21440 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
21450 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c  o *pVtabIdx = pL
21460 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  evel->plan.u.pVt
21470 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73  abIdx;.      zMs
21480 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
21490 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
214a0 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
214b0 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
214c0 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
214d0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
214e0 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
214f0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  ->idxStr);.    }
21500 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
21510 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
21520 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
21530 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
21540 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
21550 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
21560 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21570 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77  IN );.      nRow
21580 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
21590 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73  .      nRow = (s
215a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65  qlite3_int64)pLe
215b0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
215c0 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d      }.    zMsg =
215d0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
215e0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
215f0 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d  ~%lld rows)", zM
21600 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73  sg, nRow);.    s
21610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21620 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
21630 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72  iId, iLevel, iFr
21640 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  om, zMsg, P4_DYN
21650 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
21660 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
21670 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77  ainOneScan(u,v,w
21680 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
21690 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
216a0 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  PLAIN */.../*.**
216b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
216c0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
216d0 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
216e0 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
216f0 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
21700 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
21710 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
21720 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
21730 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
21740 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
21750 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
21760 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
21770 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
21780 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
21790 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
217a0 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
217b0 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
217c0 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
217d0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
217e0 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ags,      /* One
217f0 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
21800 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
21810 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
21820 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
21830 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
21840 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
21850 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
21860 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
21870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21880 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
21890 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
218a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
218b0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
218c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
218d0 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
218e0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
218f0 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
21900 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
21910 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
21920 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
21930 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
21940 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
21950 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
21960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21970 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
21980 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
21990 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
219a0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
219b0 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
219c0 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
219d0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
219e0 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
219f0 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
21a00 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
21a10 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
21a20 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
21a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
21a40 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
21a50 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
21a60 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
21a70 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
21a80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64   context */.  Vd
21a90 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ab0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
21ac0 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
21ad0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
21ae0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21af0 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
21b00 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
21b10 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
21b20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
21b50 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
21b60 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
21b70 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
21b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
21b90 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
21ba0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
21bb0 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
21bc0 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
21bd0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
21be0 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
21bf0 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
21c00 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
21c10 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
21c20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
21c30 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
21c40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
21c50 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
21c60 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
21c70 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
21c80 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f  ;.  pWC = pWInfo
21c90 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20  ->pWC;.  pLevel 
21ca0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
21cb0 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d  vel];.  pTabItem
21cc0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
21cd0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
21ce0 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
21cf0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
21d00 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c  or;.  bRev = (pL
21d10 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
21d20 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
21d30 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61  SE)!=0;.  omitTa
21d40 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  ble = (pLevel->p
21d50 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
21d60 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
21d70 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
21d80 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
21d90 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
21da0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ==0;..  /* Creat
21db0 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
21dc0 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
21dd0 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
21de0 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
21df0 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
21e00 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
21e10 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
21e20 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
21e30 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
21e40 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
21e50 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
21e60 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
21e70 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
21e80 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
21e90 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
21ea0 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
21eb0 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
21ec0 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
21ed0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
21ee0 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
21ef0 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
21f00 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
21f10 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
21f20 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
21f30 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
21f40 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
21f50 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
21f60 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
21f70 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
21f80 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
21f90 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
21fa0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21fb0 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
21fc0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
21fd0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
21fe0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
21ff0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
22000 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
22010 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
22020 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
22030 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
22040 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
22050 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
22060 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
22070 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
22080 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
22090 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
220a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
220b0 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
220c0 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
220d0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
220e0 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
220f0 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
22100 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22120 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22130 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
22140 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
22150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
22160 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
22170 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
22180 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
22190 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
221a0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65  ABLE.  if(  (pLe
221b0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
221c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
221d0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
221e0 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68    /* Case 0:  Th
221f0 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
22200 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
22210 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
22220 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
22230 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
22240 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
22250 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
22260 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
22270 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
22280 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
22290 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
222a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
222b0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
222c0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
222d0 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e  = pVtabIdx->nCon
222e0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72  straint;.    str
222f0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
22300 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
22310 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
22350 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  abIdx->aConstrai
22360 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e  ntUsage;.    con
22370 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
22380 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
22390 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20  nt *aConstraint 
223a0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
223e0 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71  straint;..    sq
223f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
22400 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
22410 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
22420 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
22430 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
22440 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
22450 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
22460 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
22470 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69  k=0; k<nConstrai
22480 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; k++){.      
22490 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e    if( aUsage[k].
224a0 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a  argvIndex==j ){.
224b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
224c0 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
224d0 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
224e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
224f0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22500 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  se, pWC->a[iTerm
22510 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ].pExpr->pRight,
22520 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20   iReg+j+1);.    
22530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22550 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e       if( k==nCon
22560 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
22570 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22580 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22590 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61  OP_Integer, pVta
225a0 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52  bIdx->idxNum, iR
225b0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
225c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
225d0 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69  _Integer, j-1, i
225e0 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
225f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
22600 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
22610 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67  r, addrBrk, iReg
22620 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53  , pVtabIdx->idxS
22630 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
22640 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
22650 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  dx->needToFreeId
22660 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54  xStr ? P4_MPRINT
22670 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
22680 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
22690 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
226a0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
226b0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
226c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
226d0 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29  aUsage[j].omit )
226e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  {.        int iT
226f0 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
22700 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[j].iTermOffset
22710 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
22720 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70  eTerm(pLevel, &p
22730 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20  WC->a[iTerm]);. 
22740 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22750 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
22760 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
22770 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
22780 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
22790 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
227a0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
227b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
227c0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
227d0 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
227e0 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
227f0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
22800 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  rse, 1);.  }else
22810 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22820 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
22830 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c  BLE */..  if( pL
22840 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22850 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
22860 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _EQ ){.    /* Ca
22870 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
22880 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
22890 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
228a0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
228b0 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
228c0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
228d0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
228e0 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
228f0 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
22900 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
22910 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
22920 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
22930 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
22940 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
22950 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
22960 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
22970 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
22980 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
22990 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
229a0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
229b0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73  O_IN, 0);.    as
229c0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
229d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
229e0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
229f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
22a00 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
22a10 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65  iCur );.    asse
22a20 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
22a30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22a40 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
22a50 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
22a60 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
22a70 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69  5-11662 */.    i
22a80 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
22a90 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
22aa0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
22ab0 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  l, iReleaseReg);
22ac0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
22ad0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
22ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22af0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
22b00 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
22b10 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
22b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22b30 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
22b40 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
22b50 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
22b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22b70 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
22b80 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
22b90 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
22ba0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
22bb0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
22bc0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
22bd0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
22be0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
22bf0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
22c00 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
22c10 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  2:  We have an i
22c20 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
22c30 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
22c40 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
22c50 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
22c60 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
22c70 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
22c80 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
22c90 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
22ca0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
22cb0 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
22cc0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
22cd0 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66  ;.    pStart = f
22ce0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
22cf0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
22d00 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
22d10 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e  ;.    pEnd = fin
22d20 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
22d30 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
22d40 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
22d50 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
22d60 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
22d70 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
22d80 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
22d90 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
22da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
22db0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
22dc0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
22dd0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
22de0 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
22df0 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
22e00 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
22e10 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
22e20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
22e30 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
22e40 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
22e50 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
22e60 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
22e70 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
22e80 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
22e90 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
22ea0 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
22eb0 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
22ec0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
22ed0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
22ee0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
22ef0 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
22f00 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
22f10 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
22f20 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
22f30 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
22f40 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
22f50 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
22f60 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
22f70 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
22f80 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
22f90 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
22fa0 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
22fb0 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
22fc0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
22fd0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
22fe0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
22ff0 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
23000 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
23010 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
23020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
23030 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
23040 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
23050 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
23060 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
23070 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
23080 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
23090 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
230a0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58  1662 */.      pX
230b0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
230c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
230d0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
230e0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
230f0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
23100 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
23110 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
23120 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
23130 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
23140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23150 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
23160 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
23170 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
23180 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
23190 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
231a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
231b0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
231c0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
231d0 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
231e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
231f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
23200 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
23210 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
23220 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
23230 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
23240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
23250 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
23260 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
23270 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
23280 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
23290 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
232a0 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
232b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
232c0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
232d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
232e0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
232f0 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
23300 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
23310 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
23320 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
23330 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
23340 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
23350 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23370 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
23380 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
23390 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
233a0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
233b0 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
233c0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
233d0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
233e0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
233f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23400 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
23410 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
23420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
23430 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
23440 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
23450 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
23460 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
23470 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
23480 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
23490 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
234a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
234b0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
234c0 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
234d0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d  .    if( pStart=
234e0 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b  =0 && pEnd==0 ){
234f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
23500 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
23510 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
23520 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
23530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
23540 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
23550 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
23560 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
23570 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
23580 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
23590 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
235a0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
235b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
235c0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
235d0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
235e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
235f0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
23600 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
23610 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
23620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23630 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
23640 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
23650 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
23660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23670 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
23680 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
23690 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
236a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
236b0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
236c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
236d0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
236e0 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
236f0 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43  _EQ) ){.    /* C
23700 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73  ase 3: A scan us
23710 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
23720 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
23730 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
23740 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
23750 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
23760 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
23770 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
23780 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
23790 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
237a0 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
237b0 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
237c0 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
237d0 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
237e0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
237f0 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
23800 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
23810 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
23820 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
23830 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
23840 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
23850 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
23860 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
23870 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
23880 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
23890 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
238a0 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
238b0 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
238c0 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
238d0 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
238e0 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
238f0 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
23900 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
23910 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
23920 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
23930 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
23940 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
23950 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23960 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
23970 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
23980 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
23990 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
239a0 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
239b0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
239c0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
239d0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
239e0 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
239f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
23a00 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
23a10 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
23a20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
23a30 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
23a40 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
23a50 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
23a60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
23a70 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
23a80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
23a90 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
23aa0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
23ab0 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
23ac0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
23ad0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
23ae0 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
23af0 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
23b00 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
23b10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
23b20 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
23b30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
23b40 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
23b50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
23b60 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
23b70 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
23b80 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
23b90 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
23ba0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
23bb0 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
23bc0 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
23bd0 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
23be0 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
23bf0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
23c00 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
23c10 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
23c20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
23c30 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
23c40 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
23c50 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
23c60 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
23c70 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
23c80 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
23c90 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
23ca0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
23cb0 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
23cc0 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
23cd0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
23ce0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
23cf0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
23d00 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
23d10 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
23d20 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
23d30 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
23d40 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
23d50 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
23d60 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
23d70 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
23d80 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
23d90 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
23da0 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
23db0 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
23dc0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
23dd0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
23de0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
23df0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
23e00 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
23e10 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
23e20 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
23e30 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
23e40 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
23e50 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
23e60 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  _Noop,          
23e70 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63     /* 0: (!end_c
23e80 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20  onstraints) */. 
23e90 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
23ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
23eb0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
23ec0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
23ed0 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20      OP_IdxLT    
23ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
23ef0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
23f00 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  && bRev) */.    
23f10 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  };.    int nEq =
23f20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
23f30 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  q;  /* Number of
23f40 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
23f50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  */.    int isMin
23f60 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
23f70 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
23f80 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
23f90 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
23fa0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73  /.    int regBas
23fb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23fc0 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
23fd0 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73  ter holding cons
23fe0 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f  traint values */
23ff0 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20  .    int r1;    
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
24020 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  er */.    WhereT
24030 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
24040 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
24050 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
24060 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
24070 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
24080 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
24090 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
240a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
240b0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
240c0 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
240e0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
240f0 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
24100 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
24110 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
24120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24130 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
24140 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
24150 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
24160 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
24170 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
24180 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
24190 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
241a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
241c0 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
241d0 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
241e0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
241f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24200 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
24210 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
24220 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24240 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
24250 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
24260 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
24270 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
24280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24290 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
242a0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
242b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
242c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
242d0 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
242e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
242f0 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
24300 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
24310 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
24320 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
24330 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64  /.    char *zEnd
24340 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
24350 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
24360 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
24370 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
24380 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
24390 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
243a0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
243b0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
243c0 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f    k = pIdx->aiCo
243d0 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f  lumn[nEq];     /
243e0 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65  * Column for ine
243f0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
24400 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  nts */..    /* I
24410 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
24420 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
24430 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
24440 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
24450 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
24460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
24470 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
24480 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
24490 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
244a0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
244b0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
244c0 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
244d0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
244e0 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
244f0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
24500 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
24510 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
24520 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
24530 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
24540 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
24550 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
24560 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
24570 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
24580 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
24590 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
245a0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
245b0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
245c0 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
245d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
245e0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
245f0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
24600 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70     && (pLevel->p
24610 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
24620 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20  E_ORDERBY).     
24630 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
24640 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
24650 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
24660 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
24670 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
24680 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
24690 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
246a0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
246b0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
246c0 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
246d0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
246e0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
246f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
24700 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
24710 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
24720 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
24730 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
24740 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
24750 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
24760 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24770 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
24780 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
24790 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
247a0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
247b0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
247c0 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
247d0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
247e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
247f0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24800 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
24810 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
24820 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
24830 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
24840 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
24850 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20   (WO_GT|WO_GE), 
24860 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
24870 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
24880 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
24890 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
248a0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
248b0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
248c0 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
248d0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
248e0 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
248f0 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
24900 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
24910 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
24920 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
24930 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
24940 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
24950 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  s(.        pPars
24960 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20  e, pLevel, pWC, 
24970 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61  notReady, nExtra
24980 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a  Reg, &zStartAff.
24990 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41      );.    zEndA
249a0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
249b0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
249c0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
249d0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
249e0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
249f0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
24a00 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
24a10 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
24a20 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
24a30 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
24a40 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
24a50 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
24a60 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
24a70 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
24a80 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
24a90 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
24aa0 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
24ab0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45     */.    if( nE
24ac0 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
24ad0 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
24ae0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
24af0 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20  =SQLITE_SO_ASC) 
24b00 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
24b10 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
24b20 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
24b30 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
24b40 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
24b50 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
24b60 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
24b70 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65   WO_LE );.    te
24b80 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
24b90 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
24ba0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
24bb0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_GE );.    tes
24bc0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
24bd0 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
24be0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
24bf0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24c00 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
24c10 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
24c20 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
24c30 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
24c40 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
24c50 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
24c60 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
24c70 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
24c80 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
24c90 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
24ca0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
24cb0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
24cc0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
24cd0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
24ce0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
24cf0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
24d00 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
24d10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
24d20 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
24d30 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
24d40 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
24d50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
24d60 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
24d70 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
24d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24d90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
24da0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
24db0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
24dc0 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
24dd0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
24de0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24df0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
24e00 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
24e10 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
24e20 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
24e30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
24e40 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
24e50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
24e60 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
24e70 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
24e80 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
24e90 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
24ea0 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
24eb0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
24ec0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
24ed0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
24ee0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
24ef0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
24f00 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
24f10 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
24f20 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
24f30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
24f40 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
24f50 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
24f60 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
24f70 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
24f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24f90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
24fa0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
24fb0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
24fc0 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
24fd0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
24fe0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
24ff0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
25000 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
25010 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
25020 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
25030 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
25040 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
25050 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
25060 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
25070 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
25080 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a  ( isMinQuery ){.
25090 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
250a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
250b0 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
250c0 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
250d0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
250e0 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
250f0 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
25100 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
25110 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
25120 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
25130 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
25140 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  nt, zStartAff);.
25150 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
25160 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
25170 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
25180 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
25190 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
251a0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
251b0 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
251c0 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
251d0 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
251e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
251f0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b  op==OP_SeekGt );
25200 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
25210 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a  p==OP_SeekGe );.
25220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
25230 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
25240 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25250 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20  =OP_SeekLt );.  
25260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25270 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
25280 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
25290 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
252a0 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  aint);..    /* L
252b0 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
252c0 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
252d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
252e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
252f0 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
25300 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
25310 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
25320 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
25330 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
25340 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
25350 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
25360 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
25370 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
25380 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
25390 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
253a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
253b0 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
253c0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
253d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
253e0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
253f0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
25400 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25410 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
25420 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
25430 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
25440 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
25450 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66       if( zEndAff
25460 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25470 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
25480 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
25490 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  EndAff[nEq])==SQ
254a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
254b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
254c0 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
254d0 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
254e0 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
254f0 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
25500 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
25510 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
25520 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
25530 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
25540 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
25550 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
25560 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
25570 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
25580 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
25590 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
255a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
255b0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
255c0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
255d0 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20  , zEndAff[nEq]) 
255e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  ){.          zEn
255f0 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
25600 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
25610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
25620 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79  .      codeApply
25630 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
25640 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c   regBase, nEq+1,
25650 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20   zEndAff);.     
25660 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
25670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25680 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
25690 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
256a0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
256b0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
256c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
256d0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
256e0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
256f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
25700 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41  Parse->db, zEndA
25710 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
25720 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
25730 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
25740 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
25750 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
25760 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
25770 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
25780 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
25790 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
257a0 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e   */.    op = aEn
257b0 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c  dOp[(pRangeEnd |
257c0 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52  | nEq) * (1 + bR
257d0 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  ev)];.    testca
257e0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20  se( op==OP_Noop 
257f0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
25800 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
25810 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
25820 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
25830 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f     if( op!=OP_No
25840 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
25850 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
25860 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
25870 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
25880 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
25890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
258a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e  beChangeP5(v, en
258b0 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b  dEq!=bRev ?1:0);
258c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
258d0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
258e0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
258f0 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
25900 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
25910 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
25920 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65  umn that the ine
25930 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e  quality contrain
25940 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  s is not NULL.. 
25950 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
25960 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
25970 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
25980 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  e loop..    */. 
25990 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
259a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
259b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
259c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
259d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
259e0 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74  M_LIMIT );.    t
259f0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
25a00 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
25a10 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
25a20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  );.    if( (pLev
25a30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25a40 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
25a50 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
25a60 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  MIT))!=0 ){.    
25a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25a80 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
25a90 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20  , iIdxCur, nEq, 
25aa0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
25ab0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25ac0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61  OP_IsNull, r1, a
25ad0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
25ae0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
25af0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25b00 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  , r1);..    /* S
25b10 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
25b20 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
25b30 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
25b40 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
25b50 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
25b60 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
25b70 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
25b80 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
25b90 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  e ){.      iRowi
25ba0 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
25bb0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
25bc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
25bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25be0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
25bf0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
25c00 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
25c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25c20 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
25c30 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
25c40 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
25c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25c60 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c  , OP_Seek, iCur,
25c70 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a   iRowidReg);  /*
25c80 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a   Deferred seek *
25c90 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
25ca0 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
25cb0 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
25cc0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
25cd0 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
25ce0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
25cf0 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
25d00 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
25d10 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
25d20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
25d30 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
25d40 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
25d50 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
25d60 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
25d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
25d80 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
25d90 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
25da0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25db0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
25dc0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
25dd0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
25de0 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65  iIdxCur;.  }else
25df0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25e00 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
25e10 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76  ATION.  if( pLev
25e20 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25e30 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
25e40 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
25e50 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   4:  Two or more
25e60 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
25e70 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
25e80 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
25e90 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
25ea0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
25eb0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
25ec0 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
25ed0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
25ee0 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
25ef0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
25f00 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
25f10 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
25f20 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
25f30 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
25f40 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
25f50 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
25f60 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
25f70 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
25f80 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
25f90 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
25fa0 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
25fb0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
25fc0 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
25fd0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
25fe0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
25ff0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
26000 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
26010 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
26020 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
26030 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
26040 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
26050 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
26060 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
26070 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
26080 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
26090 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
260a0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
260b0 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
260c0 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
260d0 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
260e0 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
260f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
26100 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
26110 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
26120 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
26130 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
26140 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
26150 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
26160 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
26170 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
26180 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
26190 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
261a0 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
261c0 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
261d0 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
261e0 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
261f0 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
26200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
26210 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
26220 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
26230 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
26240 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
26250 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
26260 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
26270 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
26280 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
26290 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
262a0 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
262b0 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
262c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
262d0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
262e0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
262f0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
26300 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
26310 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
26340 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
26350 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
26360 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
26370 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
26380 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
26390 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
263a0 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
263b0 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
263c0 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
263d0 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
263e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
263f0 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
26400 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
26410 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
26420 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
26430 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
26440 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
26450 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
26460 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
26470 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
26480 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
26490 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
264a0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  neration */..   
264b0 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d   int regReturn =
264c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
264d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
264e0 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68  gister used with
264f0 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20   OP_Gosub */.   
26500 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d   int regRowset =
26510 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26530 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65  gister for RowSe
26540 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  t object */.    
26550 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30  int regRowid = 0
26560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
26580 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f  ister holding ro
26590 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
265a0 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74  LoopBody = sqlit
265b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
265c0 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  v);  /* Start of
265d0 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
265e0 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20    int iRetInit; 
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
26610 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74  ddress of regRet
26620 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20  urn init */.    
26630 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d  int untestedTerm
26640 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
26650 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73     /* Some terms
26660 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
26670 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e  tested */.    in
26680 74 20 69 69 3b 0a 20 20 20 0a 20 20 20 20 70 54  t ii;.   .    pT
26690 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  erm = pLevel->pl
266a0 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20  an.u.pTerm;.    
266b0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
266c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
266d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
266e0 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61  ==WO_OR );.    a
266f0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
26700 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
26710 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20  INFO)!=0 );.    
26720 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWc = &pTerm->
26730 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
26740 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
26750 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  OP_Return;.    p
26760 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52  Level->p1 = regR
26770 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53  eturn;..    /* S
26780 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c  et up a new SrcL
26790 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20 63 6f  ist ni pOrTab co
267a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
267b0 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
267c0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
267d0 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d  loop in the a[0]
267e0 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f   slot and all no
267f0 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e  tReady tables in
26800 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20   a[1..] slots.. 
26810 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d     ** This becom
26820 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  es the SrcList i
26830 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
26840 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
26850 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20  hereBegin()..   
26860 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e   */.    if( pWIn
26870 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a  fo->nLevel>1 ){.
26880 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65        int nNotRe
26890 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
268a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
268b0 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74  er of notReady t
268c0 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73  ables */.      s
268d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
268e0 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20  em *origSrc;    
268f0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73   /* Original lis
26900 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
26910 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d       nNotReady =
26920 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
26930 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20  - iLevel - 1;.  
26940 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c      pOrTab = sql
26950 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61  ite3StackAllocRa
26960 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  w(pParse->db,.  
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
26990 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52  (*pOrTab)+ nNotR
269a0 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54  eady*sizeof(pOrT
269b0 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  ab->a[0]));.    
269c0 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20    if( pOrTab==0 
269d0 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64  ) return notRead
269e0 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  y;.      pOrTab-
269f0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28  >nAlloc = (i16)(
26a00 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b 0a  nNotReady + 1);.
26a10 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53        pOrTab->nS
26a20 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c  rc = pOrTab->nAl
26a30 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  loc;.      memcp
26a40 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61  y(pOrTab->a, pTa
26a50 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70  bItem, sizeof(*p
26a60 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20 20  TabItem));.     
26a70 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e 66   origSrc = pWInf
26a80 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
26a90 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b        for(k=1; k
26aa0 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b  <=nNotReady; k++
26ab0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
26ac0 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c  y(&pOrTab->a[k],
26ad0 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65 6c   &origSrc[pLevel
26ae0 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65  [k].iFrom], size
26af0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29  of(pOrTab->a[k])
26b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72 54  else{.      pOrT
26b20 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ab = pWInfo->pTa
26b30 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  bList;.    }..  
26b40 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
26b50 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69 73  the rowset regis
26b60 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e  ter to contain N
26b70 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c  ULL. An SQL NULL
26b80 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69   is .    ** equi
26b90 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70  valent to an emp
26ba0 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a  ty rowset..    *
26bb0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e  *.    ** Also in
26bc0 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75  itialize regRetu
26bd0 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  rn to contain th
26be0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
26bf0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20   instruction .  
26c00 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
26c10 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f   following the O
26c20 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65 20  P_Return at the 
26c30 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
26c40 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  op. This.    ** 
26c50 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 61  is required in a
26c60 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46   few obscure LEF
26c70 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65  T JOIN cases whe
26c80 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  re control jumps
26c90 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65  .    ** over the
26ca0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
26cb0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
26cc0 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61  f it. In this ca
26cd0 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  se the .    ** c
26ce0 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20  orrect response 
26cf0 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c  for the end-of-l
26d00 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50  oop code (the OP
26d10 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a  _Return) is to .
26d20 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f      ** fall thro
26d30 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
26d40 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73  instruction, jus
26d50 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20  t as an OP_Next 
26d60 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63  does if.    ** c
26d70 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  alled on an unin
26d80 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72  itialized cursor
26d90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26da0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
26db0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
26dc0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
26dd0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
26de0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
26df0 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
26e00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
26e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26e20 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
26e30 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a   0, regRowset);.
26e40 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e      }.    iRetIn
26e50 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  it = sqlite3Vdbe
26e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
26e70 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75  eger, 0, regRetu
26e80 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  rn);..    for(ii
26e90 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54  =0; ii<pOrWc->nT
26ea0 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  erm; ii++){.    
26eb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
26ec0 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61  Term = &pOrWc->a
26ed0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [ii];.      if( 
26ee0 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
26ef0 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72  sor==iCur || pOr
26f00 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
26f10 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =WO_AND ){.     
26f20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
26f30 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
26f40 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
26f50 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
26f60 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20  n */.        /* 
26f70 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  Loop through tab
26f80 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
26f90 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
26fa0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  rm. */.        p
26fb0 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74  SubWInfo = sqlit
26fc0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
26fd0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72  rse, pOrTab, pOr
26fe0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a  Term->pExpr, 0,.
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d          WHERE_OM
27010 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f  IT_OPEN | WHERE_
27020 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a 20 20 20  OMIT_CLOSE |.   
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45       WHERE_FORCE
27050 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  _TABLE | WHERE_O
27060 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20  NETABLE_ONLY);. 
27070 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
27080 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
27090 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
270a0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
270b0 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
270c0 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
270d0 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
270e0 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
270f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27100 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
27110 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
27120 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
27130 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
27140 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57  Set = ((ii==pOrW
27150 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69  c->nTerm-1)?-1:i
27160 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
27170 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20  int r;.         
27180 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
27190 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
271a0 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
271b0 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  ->pTab, -1, iCur
271c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
271f0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
27200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27210 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
27220 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
27230 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27260 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
27270 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20  2, r, iSet);.   
27280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
272a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
272b0 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f  , regReturn, iLo
272c0 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20  opBody);..      
272d0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57      /* The pSubW
272e0 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
272f0 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  rms flag means t
27300 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d  hat this OR term
27310 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
27320 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d  ntained one or m
27330 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f  ore AND term fro
27340 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62  m a notReady tab
27350 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  le.  The.       
27360 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d     ** terms from
27370 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61   the notReady ta
27380 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ble could not be
27390 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c   tested and will
273a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  .          ** ne
273b0 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ed to be tested 
273c0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20  later..         
273d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
273e0 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  ( pSubWInfo->unt
273f0 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74  estedTerms ) unt
27400 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
27410 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  .          /* Fi
27420 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68  nish the loop th
27430 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
27440 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
27450 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
27460 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27470 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49  3WhereEnd(pSubWI
27480 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nfo);.        }.
27490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
274a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
274b0 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69  ngeP1(v, iRetIni
274c0 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
274d0 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
274e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
274f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
27500 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
27510 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Brk);.    sqlite
27520 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27530 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  l(v, iLoopBody);
27540 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ..    if( pWInfo
27550 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c  ->nLevel>1 ) sql
27560 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50  ite3StackFree(pP
27570 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62  arse->db, pOrTab
27580 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
27590 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
275a0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
275b0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
275c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
275d0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
275e0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
275f0 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
27600 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
27610 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
27620 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
27630 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
27640 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
27650 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
27660 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
27670 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
27680 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
27690 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
276a0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
276b0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
276c0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
276d0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
276e0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
276f0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
27700 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65  le==0 );.    pLe
27710 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
27720 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
27730 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
27740 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
27750 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
27760 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
27770 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
27780 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
27790 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
277a0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
277b0 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f  N_STEP;.  }.  no
277c0 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
277d0 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
277e0 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
277f0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
27800 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
27810 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
27820 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
27830 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
27840 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
27850 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
27860 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
27870 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32  ATION-OF: R-4952
27880 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68  5-50935 Terms th
27890 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74  at cannot be sat
278a0 69 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20  isfied through. 
278b0 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69   ** the use of i
278c0 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65  ndices become te
278d0 73 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61  sts that are eva
278e0 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65  luated against e
278f0 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20  ach row of.  ** 
27900 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70  the relevant inp
27910 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  ut tables..  */.
27920 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
27930 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, j=pWC->nTerm
27940 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
27950 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
27960 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  pE;.    testcase
27970 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
27980 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
27990 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ); /* IMP: R-305
279a0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
279b0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
279c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
279d0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28  CODED );.    if(
279e0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
279f0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
27a00 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
27a10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
27a20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
27a30 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
27a40 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
27a50 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  se( pWInfo->unte
27a60 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20  stedTerms==0.   
27a70 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
27a80 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
27a90 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
27aa0 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a  BLE_ONLY)!=0 );.
27ab0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e        pWInfo->un
27ac0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
27ad0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
27ae0 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20  .    }.    pE = 
27af0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
27b00 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
27b10 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
27b20 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
27b30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
27b40 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
27b50 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ) ){.      conti
27b60 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nue;.    }.    s
27b70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
27b80 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64  e(pParse, pE, ad
27b90 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
27ba0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
27bb0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
27bc0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
27bd0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
27be0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
27bf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
27c00 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
27c10 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
27c20 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
27c30 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
27c40 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
27c50 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
27c60 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
27c70 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
27c80 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
27c90 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
27ca0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
27cb0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
27cc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27cd0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
27ce0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
27cf0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
27d00 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
27d10 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
27d20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27d30 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
27d40 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
27d50 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
27d60 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
27d70 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
27d80 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
27d90 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
27da0 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20  _VIRTUAL );  /* 
27db0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
27dc0 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  62 */.      test
27dd0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
27de0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
27df0 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
27e00 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
27e10 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
27e20 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
27e30 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
27e40 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
27e50 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
27e60 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
27e70 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
27e80 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
27e90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
27eb0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
27ec0 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
27ed0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27ee0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
27ef0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
27f00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27f10 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
27f20 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
27f30 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
27f40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
27f50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
27f60 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
27f70 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
27f80 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
27f90 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
27fa0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
27fb0 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
27fc0 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
27fd0 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
27fe0 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
27ff0 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
28000 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
28010 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
28020 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
28030 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
28040 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
28050 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
28060 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
28070 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
28080 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
28090 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
280a0 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
280b0 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
280c0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
280d0 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
280e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
280f0 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
28100 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
28110 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
28120 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
28130 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  /.../*.** Free a
28140 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
28150 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
28160 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
28170 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
28180 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
28190 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
281a0 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
281b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
281c0 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
281d0 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
281e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
281f0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
28200 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
28210 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
28220 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  nfo ){.        /
28230 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d  * assert( pInfo-
28240 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
28250 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  r==0 || db->mall
28260 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20  ocFailed ); */. 
28270 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
28280 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
28290 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
282a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
282b0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
282c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
282d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
282e0 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d   pInfo);.      }
282f0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
28300 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[i].plan.wsF
28310 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
28320 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20  P_INDEX ){.     
28330 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
28340 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
28350 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
28360 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
28370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28380 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d  DbFree(db, pIdx-
28390 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
283a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
283b0 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20  ee(db, pIdx);.  
283c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
283d0 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43      }.    whereC
283e0 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66  lauseClear(pWInf
283f0 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c  o->pWC);.    sql
28400 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
28410 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
28420 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
28430 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
28440 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
28450 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
28460 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
28470 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
28480 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
28490 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
284a0 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
284b0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
284c0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
284d0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
284e0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
284f0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
28500 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
28510 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
28520 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
28530 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
28540 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
28550 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
28560 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
28570 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
28580 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28590 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
285a0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
285b0 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
285c0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
285d0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
285e0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
285f0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
28600 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
28610 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
28620 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
28630 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
28640 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
28650 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
28660 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
28670 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
28680 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
28690 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
286a0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
286b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
286c0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
286d0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
286e0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
286f0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
28700 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
28710 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
28720 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
28730 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
28740 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
28750 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
28760 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
28770 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
28780 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
28790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
287a0 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
287b0 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
287c0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
287d0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
287f0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
28800 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
28830 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
28840 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
28870 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
28880 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
28890 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
288a0 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
288b0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
288c0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
288d0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
288e0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
288f0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
28900 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
28910 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
28920 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
28930 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
28940 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
28950 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
28960 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
28970 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
28980 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
28990 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
289a0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
289b0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
289c0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
289d0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
289e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
289f0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
28a00 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
28a10 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
28a20 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
28a30 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
28a40 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
28a50 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
28a60 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
28a70 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
28a80 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
28a90 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
28aa0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
28ab0 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
28ac0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
28ad0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
28ae0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
28af0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28b00 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
28b10 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
28b20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
28b30 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
28b40 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
28b50 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
28b60 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
28b70 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
28b80 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
28b90 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
28ba0 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
28bb0 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
28bc0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
28bd0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
28be0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
28bf0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
28c00 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
28c10 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
28c20 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
28c30 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
28c40 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
28c50 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
28c60 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
28c70 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
28c80 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
28c90 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
28ca0 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
28cb0 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
28cc0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
28cd0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
28ce0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
28cf0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
28d00 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
28d10 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
28d20 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
28d30 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
28d40 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
28d50 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
28d60 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
28d70 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
28d80 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
28d90 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
28da0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
28db0 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
28dc0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
28dd0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
28de0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
28df0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
28e00 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
28e10 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
28e20 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
28e30 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
28e40 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
28e50 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
28e60 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
28e70 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
28e80 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
28e90 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
28ea0 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
28eb0 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
28ec0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
28ed0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
28ee0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
28ef0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
28f00 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
28f10 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
28f20 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
28f30 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
28f40 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
28f50 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
28f60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
28f70 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
28f80 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
28f90 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
28fa0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
28fb0 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
28fc0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
28fd0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
28fe0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
28ff0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
29000 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
29010 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
29020 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
29030 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
29040 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
29050 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
29060 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
29070 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
29080 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
29090 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
290a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
290b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
290c0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
290d0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
290e0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
290f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
29100 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
29110 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
29120 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
29130 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
29140 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
29150 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
29160 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
29170 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
29180 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
29190 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
291a0 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
291b0 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
291c0 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
291d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
291e0 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
291f0 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
29200 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
29210 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
29220 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
29230 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
29240 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
29250 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
29260 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
29270 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
29280 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
29290 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
292a0 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
292b0 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
292c0 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
292d0 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
292e0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
292f0 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
29300 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
29310 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
29320 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
29330 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
29340 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
29350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29360 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
29370 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
29380 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29390 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
293a0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
293b0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
293c0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
293d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
293e0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
293f0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
29400 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
29410 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
29420 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
29430 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 2f  rlFlags        /
29440 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
29450 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
29460 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
29470 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
294a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  nter */.  int nB
294b0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
294c0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
294d0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
294e0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
294f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
29500 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
29510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
29520 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
29530 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
29540 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
29550 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
29560 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
29570 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
29580 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
29590 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
295a0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
295b0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
295c0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
295d0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
295e0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
295f0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
29600 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
29610 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
29620 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
29630 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
29640 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
29650 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
29660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
29670 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
29680 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29690 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
296a0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
296b0 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
296c0 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
296d0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
296e0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
296f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
29700 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
29710 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
29720 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
29750 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
29760 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
29770 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
29780 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
29790 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
297a0 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
297b0 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  Flags */.  sqlit
297c0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
297d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
297e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
297f0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
29800 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
29810 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
29820 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
29830 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
29840 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
29850 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
29860 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
29870 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
29880 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
29890 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
298a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
298b0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
298c0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
298d0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
298e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
298f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
29900 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
29910 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
29920 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
29930 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
29940 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
29950 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
29960 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
29970 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
29980 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
29990 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
299a0 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
299b0 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
299c0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
299d0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
299e0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
299f0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
29a00 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
29a10 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
29a20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29a30 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
29a40 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
29a50 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
29a60 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
29a70 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
29a80 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29a90 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
29aa0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
29ab0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
29ac0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
29ad0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
29ae0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
29af0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
29b00 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
29b10 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
29b20 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
29b30 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
29b40 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
29b50 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
29b60 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
29b70 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
29b80 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
29b90 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
29ba0 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
29bb0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
29bc0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
29bd0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
29be0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
29bf0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
29c00 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
29c10 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
29c20 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
29c30 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
29c40 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
29c50 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
29c60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
29c70 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
29c80 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
29c90 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
29ca0 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
29cb0 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
29cc0 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
29cd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
29ce0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
29cf0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
29d00 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
29d10 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
29d20 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
29d30 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
29d40 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
29d50 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
29d60 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
29d70 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
29d80 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
29d90 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
29da0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
29db0 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
29dc0 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
29dd0 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
29de0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
29df0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
29e00 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
29e10 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
29e20 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
29e30 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
29e40 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
29e50 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
29e60 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53  &pWC[1];..  /* S
29e70 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
29e80 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
29e90 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
29ea0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
29eb0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
29ec0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
29ed0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
29ee0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
29ef0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
29f00 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
29f10 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
29f20 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
29f30 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
29f40 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
29f50 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
29f60 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
29f70 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d  TK_AND);   /* IM
29f80 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36  P: R-15842-53296
29f90 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
29fa0 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
29fb0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
29fc0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
29fd0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
29fe0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
29ff0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
2a000 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
2a010 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
2a020 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
2a030 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2a040 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
2a050 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
2a060 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
2a070 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2a080 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
2a090 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
2a0a0 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
2a0b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
2a0c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
2a0d0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2a0e0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2a0f0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2a100 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2a110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2a120 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
2a130 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
2a140 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
2a150 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
2a160 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
2a170 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
2a180 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
2a190 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2a1a0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
2a1b0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
2a1c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
2a1d0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2a1e0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
2a1f0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
2a200 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
2a210 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
2a220 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
2a230 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
2a240 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2a250 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
2a260 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
2a270 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2a280 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
2a290 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
2a2a0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
2a2b0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
2a2c0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
2a2d0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
2a2e0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
2a2f0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
2a300 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
2a310 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
2a320 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2a330 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2a340 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
2a350 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
2a360 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
2a370 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c 61  ure the WhereCla
2a380 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61 62  use.vmask variab
2a390 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73 20  le so that bits 
2a3a0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a  that correspond.
2a3b0 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c 20    ** to virtual 
2a3c0 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72  table cursors ar
2a3d0 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75  e set. This is u
2a3e0 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76 65  sed to selective
2a3f0 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a  ly disable .  **
2a400 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72   the OR-to-IN tr
2a410 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20  ansformation in 
2a420 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
2a430 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20 68  m(). It is not h
2a440 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74  elpful .  ** wit
2a450 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
2a460 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
2a470 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2a480 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2a490 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2a4a0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
2a4b0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
2a4c0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
2a4d0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
2a4e0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
2a4f0 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
2a500 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
2a510 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
2a520 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
2a530 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
2a540 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
2a550 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
2a560 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 76    assert( pWC->v
2a570 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b  mask==0 && pMask
2a580 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66  Set->n==0 );.  f
2a590 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2a5a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2a5b0 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
2a5c0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2a5d0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
2a5e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2a5f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2a600 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  LE.    if( ALWAY
2a610 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  S(pTabList->a[i]
2a620 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72 74  .pTab) && IsVirt
2a630 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ual(pTabList->a[
2a640 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  i].pTab) ){.    
2a650 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d 20    pWC->vmask |= 
2a660 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20 69  ((Bitmask)1 << i
2a670 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2a680 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
2a690 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
2a6a0 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
2a6b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2a6c0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a6d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74   i++){.      Bit
2a6e0 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
2a6f0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2a700 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2a710 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2a720 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
2a730 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
2a740 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
2a750 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2a760 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
2a770 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
2a780 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
2a790 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
2a7a0 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
2a7b0 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
2a7c0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
2a7d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a7e0 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
2a7f0 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
2a800 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
2a810 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
2a820 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
2a830 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
2a840 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
2a850 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
2a860 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
2a870 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
2a880 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
2a890 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
2a8a0 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pWC);.  if( db->
2a8b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2a8c0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2a8d0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
2a8e0 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
2a8f0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
2a900 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2a910 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a920 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2a930 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
2a940 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
2a950 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
2a960 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
2a970 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
2a980 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
2a990 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
2a9a0 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
2a9b0 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
2a9c0 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
2a9d0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a9e0 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
2a9f0 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
2aa00 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
2aa10 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
2aa20 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
2aa30 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
2aa40 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
2aa50 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2aa60 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
2aa70 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
2aa80 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
2aa90 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2aaa0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2aab0 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
2aac0 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
2aad0 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2aae0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
2aaf0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2ab00 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
2ab10 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
2ab20 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
2ab30 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
2ab40 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
2ab50 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
2ab60 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
2ab70 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2ab80 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
2ab90 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
2aba0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2abb0 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a   andFlags = ~0;.
2abc0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
2abd0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
2abe0 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
2abf0 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
2ac00 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2ac10 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
2ac20 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2ac30 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
2ac40 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
2ac50 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
2ac60 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
2ac70 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
2ac80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2ac90 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
2aca0 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
2acb0 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
2acc0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2acd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2ace0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
2acf0 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
2ad00 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ad20 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
2ad30 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad50 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
2ad60 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
2ad70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
2ad80 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
2ad90 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2ada0 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
2adb0 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
2adc0 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
2add0 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
2ade0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
2adf0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
2ae00 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
2ae10 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
2ae20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2ae30 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
2ae40 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
2ae50 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
2ae60 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
2ae70 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
2ae80 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
2ae90 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
2aea0 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45  BIG_DBL;.    WHE
2aeb0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65  RETRACE(("*** Be
2aec0 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c  gin search for l
2aed0 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69  oop %d ***\n", i
2aee0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70  ));..    /* Loop
2aef0 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d   through the rem
2af00 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69  aining entries i
2af10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2af20 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20  e to find the.  
2af30 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64    ** next nested
2af40 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20   loop. The loop 
2af50 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63  tests all FROM c
2af60 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20 20  lause entries.  
2af70 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65    ** either once
2af80 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20   or twice. .    
2af90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  **.    ** The fi
2afa0 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77 61  rst test is alwa
2afb0 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  ys performed if 
2afc0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
2afd0 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20 20   more entries.  
2afe0 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61    ** remaining a
2aff0 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72 6d  nd never perform
2b000 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ed if there is o
2b010 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61  nly one FROM cla
2b020 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  use entry.    **
2b030 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e   to choose from.
2b040 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74    The first test
2b050 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f   looks for an "o
2b060 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49  ptimal" scan.  I
2b070 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  n.    ** this co
2b080 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c  ntext an optimal
2b090 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61   scan is one tha
2b0a0 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  t uses the same 
2b0b0 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20  strategy.    ** 
2b0c0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52  for the given FR
2b0d0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  OM clause entry 
2b0e0 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65  as would be sele
2b0f0 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72  cted if the entr
2b100 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73  y.    ** were us
2b110 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d  ed as the innerm
2b120 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ost nested loop.
2b130 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2b140 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  , a table.    **
2b150 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20   is chosen such 
2b160 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
2b170 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61   running that ta
2b180 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ble cannot be re
2b190 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  duced.    ** by 
2b1a0 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65  waiting for othe
2b1b0 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20  r tables to run 
2b1c0 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f 70  first.  This "op
2b1d0 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72 6b  timal" test work
2b1e0 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72 73  s.    ** by firs
2b1f0 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  t assuming that 
2b200 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b210 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20  is on the inner 
2b220 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e 67  loop and finding
2b230 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65 72  .    ** its quer
2b240 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65  y plan, then che
2b250 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
2b260 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e 20  that query plan 
2b270 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20  uses any.    ** 
2b280 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
2b290 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  e terms that are
2b2a0 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66 20 6e   notReady.  If n
2b2b0 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72 6d 73  o notReady terms
2b2c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73 65 64   are.    ** used
2b2d0 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69 6d   then the "optim
2b2e0 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20 77  al" query plan w
2b2f0 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  orks..    **.   
2b300 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2b310 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77  e WhereCost.nRow
2b320 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
2b330 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d  n optimal scan m
2b340 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  ight.    ** not 
2b350 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20 69  be as small as i
2b360 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74 68  t would be if th
2b370 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 77  e table really w
2b380 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73  ere the innermos
2b390 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20  t.    ** join.  
2b3a0 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 63  The nRow value c
2b3b0 61 6e 20 62 65 20 72 65 64 75 63 65 64 20 62 79  an be reduced by
2b3c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
2b3d0 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
2b3e0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
2b3f0 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20 74   indices.  But t
2b400 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74 69  his nRow reducti
2b410 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  on only happens 
2b420 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  if the.    ** ta
2b430 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
2b440 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e  e innermost join
2b450 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
2b460 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f  * The second loo
2b470 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f  p iteration is o
2b480 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66  nly performed if
2b490 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   no optimal scan
2b4a0 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67 69  .    ** strategi
2b4b0 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79  es were found by
2b4c0 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
2b4d0 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e  tion. This secon
2b4e0 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20  d iteration.    
2b4f0 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  ** is used to se
2b500 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f 77  arch for the low
2b510 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76  est cost scan ov
2b520 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  erall..    **.  
2b530 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65    ** Previous ve
2b540 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2b550 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20   performed only 
2b560 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
2b570 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68  tion -.    ** th
2b580 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74  e next outermost
2b590 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73   loop was always
2b5a0 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c   that with the l
2b5b0 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20  owest overall.  
2b5c0 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76    ** cost. Howev
2b5d0 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74  er, this meant t
2b5e0 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64  hat SQLite could
2b5f0 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e   select the wron
2b600 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f  g plan.    ** fo
2b610 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61  r scripts such a
2b620 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2b630 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a  .    **   .    *
2b640 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
2b650 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20   t1(a, b); .    
2b660 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2b670 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20  E t2(c, d);.    
2b680 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2b690 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  OM t2, t1 WHERE 
2b6a0 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b  t2.rowid = t1.a;
2b6b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b6c0 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79  he best strategy
2b6d0 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74   is to iterate t
2b6e0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20  hrough table t1 
2b6f0 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69  first. However i
2b700 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
2b710 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
2b720 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20  rmine this with 
2b730 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
2b740 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
2b750 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 73 74  * Since the cost
2b760 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61   of a linear sca
2b770 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  n through table 
2b780 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20 0a  t2 is the same .
2b790 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63 6f      ** as the co
2b7a0 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
2b7b0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
2b7c0 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20 67  e t1, a simple g
2b7d0 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c  reedy .    ** al
2b7e0 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f  gorithm may choo
2b7f0 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f 72  se to use t2 for
2b800 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c   the outer loop,
2b810 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63 68   which is a much
2b820 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72  .    ** costlier
2b830 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a   approach..    *
2b840 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61  /.    nUnconstra
2b850 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f  ined = 0;.    no
2b860 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 20 20  tIndexed = 0;.  
2b870 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d    for(isOptimal=
2b880 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d  (iFrom<nTabList-
2b890 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30  1); isOptimal>=0
2b8a0 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f   && bestJ<0; isO
2b8b0 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20  ptimal--){.     
2b8c0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 20 20   Bitmask mask;  
2b8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2b8e0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e 6f 74  sk of tables not
2b8f0 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a 20 20   yet ready */.  
2b900 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
2b910 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
2b920 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61  ist->a[j]; j<nTa
2b930 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54 61 62  bList; j++, pTab
2b940 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2b950 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65   int doNotReorde
2b960 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  r;    /* True if
2b970 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75   this table shou
2b980 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65  ld not be reorde
2b990 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 57  red */.        W
2b9a0 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20  hereCost sCost; 
2b9b0 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f      /* Cost info
2b9c0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73  rmation from bes
2b9d0 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78 28  t[Virtual]Index(
2b9e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  ) */.        Exp
2b9f0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
2ba00 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
2ba10 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20 74  ause for index t
2ba20 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20  o optimize */.  
2ba30 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  .        doNotRe
2ba40 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
2ba50 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
2ba60 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
2ba70 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  ))!=0;.        i
2ba80 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64  f( j!=iFrom && d
2ba90 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
2baa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d  eak;.        m =
2bab0 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2bac0 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
2bad0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rsor);.        i
2bae0 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
2baf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2bb00 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29    if( j==iFrom )
2bb10 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20   iFrom++;.      
2bb20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2bb30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb40 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61  mask = (isOptima
2bb50 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65 61 64 79  l ? m : notReady
2bb60 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  );.        pOrde
2bb70 72 42 79 20 3d 20 28 28 69 3d 3d 30 20 26 26 20  rBy = ((i==0 && 
2bb80 70 70 4f 72 64 65 72 42 79 20 29 3f 2a 70 70 4f  ppOrderBy )?*ppO
2bb90 72 64 65 72 42 79 3a 30 29 3b 0a 20 20 20 20 20  rderBy:0);.     
2bba0 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
2bbb0 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e  >pIndex==0 ) nUn
2bbc0 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20  constrained++;. 
2bbd0 20 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54   .        WHERET
2bbe0 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e  RACE(("=== tryin
2bbf0 67 20 74 61 62 6c 65 20 25 64 20 77 69 74 68 20  g table %d with 
2bc00 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d  isOptimal=%d ===
2bc10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2bc20 20 20 20 20 20 20 20 20 20 6a 2c 20 69 73 4f 70           j, isOp
2bc30 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20 20  timal));.       
2bc40 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
2bc50 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  m->pTab );.#ifnd
2bc60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2bc70 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2bc80 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2bc90 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  l(pTabItem->pTab
2bca0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
2bcb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2bcc0 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f  o **pp = &pWInfo
2bcd0 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
2bce0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 56  .          bestV
2bcf0 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
2bd00 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
2bd10 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64  m, mask, notRead
2bd20 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  y, pOrderBy,.   
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 2c 20          &sCost, 
2bd50 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pp);.        }el
2bd60 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
2bd70 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62     {.          b
2bd80 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 50  estBtreeIndex(pP
2bd90 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
2bda0 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65  tem, mask, notRe
2bdb0 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  ady, pOrderBy,. 
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 29 3b          &sCost);
2bde0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bdf0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74     assert( isOpt
2be00 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75  imal || (sCost.u
2be10 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30  sed&notReady)==0
2be20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   );..        /* 
2be30 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
2be40 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
2be50 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61  nt, then the pla
2be60 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a  n must use that.
2be70 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
2be80 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79 20   if it uses any 
2be90 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a  index at all */.
2bea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2beb0 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2bec0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
2bed0 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74         || (sCost
2bee0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2bef0 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2bf00 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  AN)==0.         
2bf10 20 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73           || sCos
2bf20 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  t.plan.u.pIdx==p
2bf30 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  TabItem->pIndex 
2bf40 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
2bf50 69 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43  isOptimal && (sC
2bf60 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
2bf70 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
2bf80 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
2bf90 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65         notIndexe
2bfa0 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  d |= m;.        
2bfb0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  }..        /* Co
2bfc0 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77  nditions under w
2bfd0 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65 20  hich this table 
2bfe0 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74  becomes the best
2bff0 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20   so far:.       
2c000 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c010 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d   (1) The table m
2c020 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f  ust not depend o
2c030 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74  n other tables t
2c040 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20  hat have not.   
2c050 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65       **       ye
2c060 74 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a  t run..        *
2c070 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
2c080 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  2) A full-table-
2c090 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74  scan plan cannot
2c0a0 20 73 75 70 65 72 63 65 64 65 20 69 6e 64 65 78   supercede index
2c0b0 65 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20  ed plan unless. 
2c0c0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2c0d0 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  the full-table-s
2c0e0 63 61 6e 20 69 73 20 61 6e 20 22 6f 70 74 69 6d  can is an "optim
2c0f0 61 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69  al" plan as defi
2c100 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
2c110 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2c120 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65     (3) All table
2c130 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45  s have an INDEXE
2c140 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74  D BY clause or t
2c150 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20  his table lacks 
2c160 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  an.        **   
2c170 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63      INDEXED BY c
2c180 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61  lause or this ta
2c190 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65  ble uses the spe
2c1a0 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a  cific.        **
2c1b0 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65         index spe
2c1c0 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e  cified by its IN
2c1d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
2c1e0 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75    This rule ensu
2c1f0 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  res.        **  
2c200 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74       that a best
2c210 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79  -so-far is alway
2c220 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20  s selected even 
2c230 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65  if an impossible
2c240 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c250 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66    combination of
2c260 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2c270 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20  ses are given.  
2c280 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  The error.      
2c290 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20    **       will 
2c2a0 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
2c2b0 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20  relayed back to 
2c2c0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
2c2d0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  later..        *
2c2e0 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45  *       The NEVE
2c2f0 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  R() comes about 
2c300 62 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29  because rule (2)
2c310 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a   above prevents.
2c320 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2c330 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75   An indexable fu
2c340 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72  ll-table-scan fr
2c350 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65  om reaching rule
2c360 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (3)..        **
2c370 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34  .        **   (4
2c380 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20  ) The plan cost 
2c390 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68  must be lower th
2c3a0 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f  an prior plans o
2c3b0 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20  r else the.     
2c3c0 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74     **       cost
2c3d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
2c3e0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
2c3f0 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65   of rows must be
2c400 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20   lower..        
2c410 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
2c420 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65  sCost.used&notRe
2c430 61 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20  ady)==0         
2c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c450 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
2c460 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20      && (bestJ<0 
2c470 7c 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d  || (notIndexed&m
2c480 29 21 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )!=0            
2c490 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2c4b0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
2c4c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2c4d0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a  OT_FULLSCAN)==0.
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4f0 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77  || (sCost.plan.w
2c500 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2c510 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29  OT_FULLSCAN)!=0)
2c520 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2c530 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d  (nUnconstrained=
2c540 3d 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e  =0 || pTabItem->
2c550 70 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28  pIndex==0   /* (
2c560 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  3) */.          
2c570 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28        || NEVER((
2c580 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  sCost.plan.wsFla
2c590 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
2c5a0 55 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20  ULLSCAN)!=0)).  
2c5b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65            && (be
2c5c0 73 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72  stJ<0 || sCost.r
2c5d0 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43  Cost<bestPlan.rC
2c5e0 6f 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20  ost      /* (4) 
2c5f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c600 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f     || (sCost.rCo
2c610 73 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f  st<=bestPlan.rCo
2c620 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2c630 20 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c       && sCost.pl
2c640 61 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e  an.nRow<bestPlan
2c650 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20  .plan.nRow)).   
2c660 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c670 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d    WHERETRACE(("=
2c680 3d 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20 62  == table %d is b
2c690 65 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20  est so far".    
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67    " with cost=%g
2c6c0 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c   and nRow=%g\n",
2c6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c6e0 20 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e         j, sCost.
2c6f0 72 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61  rCost, sCost.pla
2c700 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  n.nRow));.      
2c710 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73      bestPlan = s
2c720 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
2c730 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
2c740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c750 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
2c760 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2c770 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2c780 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20   bestJ>=0 );.   
2c790 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64   assert( notRead
2c7a0 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  y & getMask(pMas
2c7b0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2c7c0 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
2c7d0 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52  ) );.    WHERETR
2c7e0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
2c7f0 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c  zer selects tabl
2c800 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64  e %d for loop %d
2c810 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2c820 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67    " with cost=%g
2c830 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c   and nRow=%g\n",
2c840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c850 20 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70   bestJ, pLevel-p
2c860 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c  WInfo->a, bestPl
2c870 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c  an.rCost, bestPl
2c880 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a  an.plan.nRow));.
2c890 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2c8a0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2c8b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21   WHERE_ORDERBY)!
2c8c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  =0 ){.      *ppO
2c8d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2c8e0 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26  }.    andFlags &
2c8f0 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  = bestPlan.plan.
2c900 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  wsFlags;.    pLe
2c910 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74  vel->plan = best
2c920 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74  Plan.plan;.    t
2c930 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61  estcase( bestPla
2c940 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2c950 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2c960 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2c970 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2c980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2c990 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20 20  MP_INDEX );.    
2c9a0 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  if( bestPlan.pla
2c9b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
2c9c0 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45  RE_INDEXED|WHERE
2c9d0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a  _TEMP_INDEX) ){.
2c9e0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
2c9f0 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
2ca00 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
2ca10 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
2ca20 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
2ca30 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
2ca40 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  y &= ~getMask(pM
2ca50 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
2ca60 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
2ca70 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
2ca80 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73  >iFrom = (u8)bes
2ca90 74 4a 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74  tJ;.    if( best
2caa0 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d  Plan.plan.nRow>=
2cab0 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20  (double)1 ){.   
2cac0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
2cad0 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61  yLoop *= bestPla
2cae0 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20  n.plan.nRow;.   
2caf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
2cb00 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61 62   that if the tab
2cb10 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  le scanned by th
2cb20 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  is loop iteratio
2cb30 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20  n had an.    ** 
2cb40 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2cb50 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  e attached to it
2cb60 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64  , that the named
2cb70 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a   index is being.
2cb80 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20      ** used for 
2cb90 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74  the scan. If not
2cba0 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d  , then query com
2cbb0 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69  pilation has fai
2cbc0 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75  led..    ** Retu
2cbd0 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  rn an error..   
2cbe0 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70   */.    pIdx = p
2cbf0 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
2cc00 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ].pIndex;.    if
2cc10 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
2cc20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
2cc30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2cc40 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
2cc50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2cc60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2cc70 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e  , "cannot use in
2cc80 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e  dex: %s", pIdx->
2cc90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2cca0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2ccb0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
2ccc0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
2ccd0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2cce0 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20 74  lause is used, t
2ccf0 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 66  he bestIndex() f
2cd00 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  unction is.     
2cd10 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
2cd20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64   to find the ind
2cd30 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ex specified in 
2cd40 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
2cd50 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
2cd60 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69   if it find an i
2cd70 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a  ndex at all. */.
2cd80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cd90 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e  bestPlan.plan.u.
2cda0 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20  pIdx==pIdx );.  
2cdb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2cdc0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
2cdd0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
2cde0 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
2cdf0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2ce00 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2ce10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2ce20 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2ce30 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  or;.  }..  /* If
2ce40 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
2ce50 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
2ce60 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
2ce70 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2ce80 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
2ce90 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
2cea0 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
2ceb0 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
2cec0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
2ced0 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
2cee0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
2cef0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
2cf00 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
2cf10 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ETE statement th
2cf20 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  at is requesting
2cf30 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f  .  ** to use a o
2cf40 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
2cf50 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  m, determine if 
2cf60 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72 69  this is appropri
2cf70 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  ate..  ** The on
2cf80 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
2cf90 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74   only works if t
2cfa0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2cfb0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
2cfc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
2cfd0 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c  o update a singl
2cfe0 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73  e row..  */.  as
2cff0 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
2d000 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2d010 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2d020 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2d030 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
2d040 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d050 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2d060 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73  !=0 && (andFlags
2d070 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
2d080 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66  !=0 ){.    pWInf
2d090 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31  o->okOnePass = 1
2d0a0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
2d0b0 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  0].plan.wsFlags 
2d0c0 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e  &= ~WHERE_IDX_ON
2d0d0 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  LY;.  }..  /* Op
2d0e0 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
2d0f0 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
2d100 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
2d110 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
2d120 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
2d130 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73  tables..  */.  s
2d140 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2d150 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
2d160 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  1); /* Insert th
2d170 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65  e cookie verifie
2d180 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52  r Goto */.  notR
2d190 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2d1a0 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52  )0;.  pWInfo->nR
2d1b0 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29  owOut = (double)
2d1c0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  1;.  for(i=0, pL
2d1d0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2d1e0 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
2d1f0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2d200 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
2d210 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
2d220 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
2d230 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2d240 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
2d250 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
2d260 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54  index */..    pT
2d270 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
2d280 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2d290 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
2d2a0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
2d2b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
2d2c0 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
2d2d0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 57  >iCursor;.    pW
2d2e0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d  Info->nRowOut *=
2d2f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52   pLevel->plan.nR
2d300 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ow;.    iDb = sq
2d310 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2d320 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
2d330 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28  hema);.    if( (
2d340 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2d350 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2d360 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  0 || pTab->pSele
2d370 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  ct ){.      /* D
2d380 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
2d390 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53   }else.#ifndef S
2d3a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d3b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2d3c0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2d3d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2d3e0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
2d3f0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2d400 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e  ar *pVTab = (con
2d410 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2d420 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
2d430 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  Tab);.      int 
2d440 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
2d450 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2d460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d470 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  4(v, OP_VOpen, i
2d480 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62  Cur, 0, 0, pVTab
2d490 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
2d4a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2d4b0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2d4c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2d4d0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
2d4e0 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
2d4f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2d500 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b  OMIT_OPEN)==0 ){
2d510 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2d520 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2d530 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  s ? OP_OpenWrite
2d540 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   : OP_OpenRead;.
2d550 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
2d560 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
2d570 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2d580 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
2d590 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2d5a0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
2d5b0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
2d5c0 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f  tcase( pTab->nCo
2d5d0 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
2d5e0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
2d5f0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
2d600 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20  nCol<BMS ){.    
2d610 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
2d620 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2d630 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2d640 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2d650 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
2d660 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
2d670 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2d680 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
2d690 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
2d6a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2d6c0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2d6d0 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
2d6e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d6f0 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
2d700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2d710 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2d720 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
2d730 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
2d740 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
2d750 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  me);.    }.#ifnd
2d760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2d770 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2d780 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2d790 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d7a0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2d7b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2d7c0 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
2d7d0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
2d7e0 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
2d7f0 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  eady, pLevel);. 
2d800 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2d810 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2d820 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2d830 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2d840 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  0 ){.      Index
2d850 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   *pIx = pLevel->
2d860 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
2d870 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2d880 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
2d890 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
2d8a0 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Ix);.      int i
2d8b0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
2d8c0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2d8d0 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
2d8e0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
2d8f0 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
2d900 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20  ert( iIdxCur>=0 
2d910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d920 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2d930 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
2d940 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
2d950 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2d960 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2d970 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
2d980 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
2d990 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d9a0 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a  (v, "%s", pIx->z
2d9b0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
2d9c0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
2d9d0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
2d9e0 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52  , iDb);.    notR
2d9f0 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2da00 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
2da10 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2da20 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  r);.  }.  pWInfo
2da30 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
2da40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2da50 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
2da60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2da70 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2da80 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
2da90 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
2daa0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
2dab0 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
2dac0 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
2dad0 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
2dae0 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
2daf0 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
2db00 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
2db10 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
2db20 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2db30 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30  ask)0;.  for(i=0
2db40 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2db50 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  +){.    pLevel =
2db60 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
2db70 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63      explainOneSc
2db80 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  an(pParse, pTabL
2db90 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 2c 20  ist, pLevel, i, 
2dba0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
2dbb0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
2dbc0 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
2dbd0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
2dbe0 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c 61 67  fo, i, wctrlFlag
2dbf0 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  s, notReady);.  
2dc00 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
2dc10 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  nue = pLevel->ad
2dc20 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66  drCont;.  }..#if
2dc30 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
2dc40 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
2dc50 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
2dc60 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
2dc70 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
2dc80 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
2dc90 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
2dca0 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
2dcb0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
2dcc0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
2dcd0 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
2dce0 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
2dcf0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
2dd00 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
2dd10 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
2dd20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
2dd30 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
2dd40 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
2dd50 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
2dd60 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
2dd70 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
2dd80 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
2dd90 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69  or(i=0; i<nTabLi
2dda0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  st; i++){.    ch
2ddb0 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
2ddc0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
2ddd0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2dde0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2ddf0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2de00 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
2de10 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
2de20 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
2de30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
2de40 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
2de50 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
2de60 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
2de70 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
2de80 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
2de90 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
2dea0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2deb0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2dec0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
2ded0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2dee0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2def0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
2df00 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
2df10 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
2df20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2df30 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2df40 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2df50 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
2df60 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
2df70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2df80 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2df90 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
2dfa0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
2dfb0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
2dfc0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2dfd0 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
2dfe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2dff0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2e000 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
2e010 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
2e020 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2e030 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2e040 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
2e050 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
2e060 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2e070 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2e080 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
2e090 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
2e0a0 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
2e0b0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2e0c0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e0d0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
2e0e0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
2e0f0 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65  e3Strlen30(pLeve
2e100 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
2e110 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
2e120 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
2e130 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
2e140 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
2e150 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2e160 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2e170 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
2e180 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
2e190 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
2e1a0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
2e1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
2e1c0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
2e1d0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
2e1e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2e1f0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
2e200 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2e210 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29  Plan], "{} ", 3)
2e220 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
2e230 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
2e240 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
2e250 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
2e260 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
2e270 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
2e280 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2e290 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
2e2a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
2e2b0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
2e2c0 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
2e2d0 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
2e2e0 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
2e2f0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2e300 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
2e310 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
2e320 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
2e330 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
2e340 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
2e350 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
2e360 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
2e370 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57    */.  return pW
2e380 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
2e390 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
2e3a0 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
2e3b0 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20  ginError:.  if( 
2e3c0 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50  pWInfo ){.    pP
2e3d0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2e3e0 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
2e3f0 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  NQueryLoop;.    
2e400 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
2e410 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20  , pWInfo);.  }. 
2e420 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2e430 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
2e440 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2e450 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d  E loop.  See com
2e460 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c  ments on .** sql
2e470 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2e480 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2e490 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2e4a0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72  void sqlite3Wher
2e4b0 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a  eEnd(WhereInfo *
2e4c0 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65  pWInfo){.  Parse
2e4d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
2e4e0 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62  o->pParse;.  Vdb
2e4f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2e500 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2e510 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2e520 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  vel;.  SrcList *
2e530 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2e540 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2e550 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2e560 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2e570 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2e580 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2e590 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
2e5a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2e5b0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49  se);.  for(i=pWI
2e5c0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  nfo->nLevel-1; i
2e5d0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2e5e0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2e5f0 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
2e600 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e610 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e620 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  drCont);.    if(
2e630 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
2e640 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
2e650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e660 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
2e670 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2e680 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71  l->p2);.      sq
2e690 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e6a0 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
2e6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e6c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2e6d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2e6e0 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2e6f0 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2e700 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2e710 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2e720 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2e730 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2e740 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2e750 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2e760 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2e770 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2e780 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2e790 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2e7a0 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2e7b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e7c0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2e7d0 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2e7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e7f0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
2e800 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
2e810 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
2e820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2e830 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2e840 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
2e850 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2e860 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
2e870 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2e880 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
2e890 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2e8a0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2e8b0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
2e8c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2e8d0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
2e8e0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
2e8f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2e900 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2e910 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
2e920 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
2e930 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e  ssert( (pLevel->
2e940 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e950 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2e960 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
2e970 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2e980 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2e990 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
2e9a0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2e9b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e9c0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2e9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2e9e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2e9f0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
2ea00 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2ea10 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
2ea20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2ea30 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20  >iIdxCur>=0 ){. 
2ea40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ea50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2ea60 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2ea70 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2ea80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2ea90 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
2eaa0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
2eab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2eac0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
2ead0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2eae0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2eaf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eb00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2eb10 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2eb20 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
2eb30 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
2eb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2eb50 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
2eb60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2eb70 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
2eb80 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
2eb90 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
2eba0 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
2ebb0 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
2ebc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2ebd0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2ebe0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
2ebf0 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
2ec00 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
2ec10 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
2ec20 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
2ec30 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61  eBegin..  */.  a
2ec40 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
2ec50 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e  Level==1 || pWIn
2ec60 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62  fo->nLevel==pTab
2ec70 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
2ec80 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2ec90 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
2eca0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
2ecb0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2ecc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ecd0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
2ece0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2ecf0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2ed00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2ed10 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
2ed20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2ed30 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
2ed40 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2ed50 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
2ed60 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
2ed70 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
2ed80 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
2ed90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2eda0 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  MIT_CLOSE)==0.  
2edb0 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
2edc0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
2edd0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  .wsFlags;.      
2ede0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
2edf0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
2ee00 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2ee10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2ee20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ee30 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
2ee40 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2ee50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ee60 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
2ee70 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
2ee80 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2ee90 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NDEX)==0 ){.    
2eea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2eeb0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2eec0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
2eed0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
2eee0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
2eef0 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
2ef00 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65  index, make code
2ef10 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
2ef20 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
2ef30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
2ef40 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20  x in preference 
2ef50 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f  to the table. So
2ef60 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65  metimes, this me
2ef70 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ans.    ** the t
2ef80 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20  able need never 
2ef90 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68  be read from. Th
2efa0 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61  is is a performa
2efb0 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a  nce boost,.    *
2efc0 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65  * as the vdbe le
2efd0 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20  vel waits until 
2efe0 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61  the table is rea
2eff0 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c  d before actuall
2f000 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67  y.    ** seeking
2f010 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
2f020 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  r to the record 
2f030 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2f040 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
2f050 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   ** position in 
2f060 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
2f070 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2f080 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2f090 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2f0a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f0b0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2f0c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2f0d0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2f0e0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2f0f0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2f100 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2f110 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2f120 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2f130 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2f140 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2f150 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2f160 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2f170 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2f180 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2f190 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2f1a0 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2f1b0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2f1c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f1d0 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21  INDEXED)!=0 && !
2f1e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f1f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
2f200 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
2f210 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
2f220 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2f230 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
2f240 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
2f250 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
2f260 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
2f270 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
2f280 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
2f290 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2f2a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f2b0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
2f2c0 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
2f2d0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
2f2e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2f2f0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
2f300 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
2f310 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
2f320 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2f330 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
2f340 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f350 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
2f360 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2f370 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
2f380 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2f390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f3a0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
2f3c0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
2f3d0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
2f3e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f3f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f410 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
2f420 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2f430 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2f440 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2f450 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
2f460 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
2f470 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
2f480 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
2f490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
2f4a0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2f4b0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2f4c0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
2f4d0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
2f4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f4f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2f500 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
2f510 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
2f520 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2f530 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2f540 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
2f550 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
2f560 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.