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

Artifact d4ce63a2887dab037d9d9830abbfcac2643e308a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20  _ENABLE_STAT3.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65  sing stat3 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  ereTerms..**.** 
15f0: 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70  Explanation of p
1600: 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48  Outer:  For a WH
1610: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
1620: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
1630: 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62         a AND ((b
1640: 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e   AND c) OR (d AN
1650: 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a  D e)) AND f.**.*
1660: 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61  * There are sepa
1670: 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65  rate WhereClause
1680: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65   objects for the
1690: 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e   whole clause an
16a0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62  d for.** the sub
16b0: 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20  clauses "(b AND 
16c0: 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20  c)" and "(d AND 
16d0: 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72  e)".  The pOuter
16e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a   field of the.**
16f0: 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e   subclauses poin
1700: 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ts to the WhereC
1710: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72  lause object for
1720: 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73   the whole claus
1730: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1740: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
1750: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1770: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1780: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
1790: 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70  MaskSet;  /* Map
17a0: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75  ping of table cu
17b0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
17c0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 42 69  bitmasks */.  Bi
17d0: 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20  tmask vmask;    
17e0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
17f0: 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 76 69  k identifying vi
1800: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
1810: 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ors */.  WhereCl
1820: 61 75 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20  ause *pOuter;   
1830: 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75    /* Outer conju
1840: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f  nction */.  u8 o
1850: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1860: 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70       /* Split op
1870: 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20  erator.  TK_AND 
1880: 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 75 31  or TK_OR */.  u1
1890: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
18a0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
18b0: 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e  include WHERE_AN
18c0: 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69 6e 74 20  D_ONLY */.  int 
18d0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
1900: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
1910: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1920: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
1930: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1940: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1950: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
1960: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
1970: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
1980: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1990: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
19a0: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
19b0: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
19c0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
19d0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
19e0: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
19f0: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
1a00: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
1a10: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
1a20: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
1a30: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1a40: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1a50: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
1a60: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
1a70: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
1a80: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1a90: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
1aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1ab0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1ac0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
1ad0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1ae0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
1af0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
1b00: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1b10: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
1b20: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
1b30: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
1b40: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
1b50: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
1b60: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
1b70: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
1b80: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
1b90: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
1ba0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1bb0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1bc0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1bd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1be0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1bf0: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
1c00: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
1c10: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
1c20: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
1c30: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
1c40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1c50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1c60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1c70: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1c80: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1c90: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1ca0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1cb0: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1cc0: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1cd0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1ce0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1cf0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1d00: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1d10: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
1d20: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
1d30: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
1d40: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
1d50: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
1d60: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
1d70: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1d80: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1d90: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1da0: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1db0: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1dc0: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1dd0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1de0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1df0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1e00: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1e10: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
1e20: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
1e30: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
1e40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1e50: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
1e60: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
1e70: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1e80: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
1e90: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1ea0: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1eb0: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1ec0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1ed0: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1ee0: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1ef0: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1f00: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
1f10: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1f20: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
1f30: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
1f40: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
1f50: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
1f60: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1f70: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
1f80: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
1f90: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
1fa0: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
1fb0: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
1fc0: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
1fd0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1fe0: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
1ff0: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
2000: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
2010: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
2020: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
2030: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
2040: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
2050: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
2060: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
2070: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
2080: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
2090: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
20a0: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
20b0: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
20c0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
20d0: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
20e0: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
20f0: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
2100: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
2110: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
2120: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
2130: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
2140: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
2150: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
2180: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
2190: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
21a0: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
21b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21c0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
21d0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
21e0: 2a 20 41 20 57 68 65 72 65 43 6f 73 74 20 6f 62  * A WhereCost ob
21f0: 6a 65 63 74 20 72 65 63 6f 72 64 73 20 61 20 6c  ject records a l
2200: 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20 61  ookup strategy a
2210: 6e 64 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  nd the estimated
2220: 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70 75 72 73  .** cost of purs
2230: 75 69 6e 67 20 74 68 61 74 20 73 74 72 61 74 65  uing that strate
2240: 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  gy..*/.struct Wh
2250: 65 72 65 43 6f 73 74 20 7b 0a 20 20 57 68 65 72  ereCost {.  Wher
2260: 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20 20 20 2f  ePlan plan;    /
2270: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 73 74 72  * The lookup str
2280: 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c  ategy */.  doubl
2290: 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  e rCost;      /*
22a0: 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74 20 6f 66   Overall cost of
22b0: 20 70 75 72 73 75 69 6e 67 20 74 68 69 73 20 73   pursuing this s
22c0: 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a  earch strategy *
22d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64  /.  Bitmask used
22e0: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
22f0: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65  k of cursors use
2300: 64 20 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a  d by this plan *
2310: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d  /.};../*.** Bitm
2320: 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65  asks for the ope
2330: 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69  rators that indi
2340: 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ces are able to 
2350: 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20  exploit.  An.** 
2360: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
2370: 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65  n of these value
2380: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  s can be used wh
2390: 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  en searching for
23a0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
23b0: 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a   where clause..*
23c0: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
23d0: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
23e0: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
23f0: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
2400: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2410: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
2420: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
2430: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
2440: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
2450: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
2460: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
2470: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
2480: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
2490: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
24a0: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
24b0: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
24c0: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
24d0: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
24e0: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
24f0: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
2500: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
2510: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
2520: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2530: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
2540: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
2550: 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30  fine WO_NOOP   0
2560: 78 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68  x800       /* Th
2570: 69 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  is term does not
2580: 20 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68   restrict search
2590: 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69   space */..#defi
25a0: 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66  ne WO_ALL    0xf
25b0: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
25c0: 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65   of all possible
25d0: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
25e0: 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c  #define WO_SINGL
25f0: 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a  E 0x0ff       /*
2600: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e   Mask of all non
2610: 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76  -compound WO_* v
2620: 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alues */../*.** 
2630: 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67  Value for wsFlag
2640: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65  s returned by be
2650: 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74  stIndex() and st
2660: 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65  ored in.** Where
2670: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20  Level.wsFlags.  
2680: 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74 65  These flags dete
2690: 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61 72  rmine which sear
26a0: 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73  ch.** strategies
26b0: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
26c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73  ..**.** The leas
26d0: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31 32  t significant 12
26e0: 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76 65   bits is reserve
26f0: 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72 20  d as a mask for 
2700: 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76 65  WO_ values above
2710: 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c 65  ..** The WhereLe
2720: 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c  vel.wsFlags fiel
2730: 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74  d is usually set
2740: 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   to WO_IN|WO_EQ|
2750: 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75  WO_ISNULL..** Bu
2760: 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  t if the table i
2770: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
2780: 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  e of a left join
2790: 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46  , WhereLevel.wsF
27a0: 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20 74  lags.** is set t
27b0: 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20  o WO_IN|WO_EQ.  
27c0: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 77  The WhereLevel.w
27d0: 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61 6e  sFlags field can
27e0: 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61 73   then be used as
27f0: 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61 72  .** the "op" par
2800: 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54 65  ameter to findTe
2810: 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20 72  rm when we are r
2820: 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69 74  esolving equalit
2830: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
2840: 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  * ISNULL constra
2850: 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20 6e  ints will then n
2860: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68  ot be used on th
2870: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2880: 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e   a left.** join.
2890: 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37 20    Tickets #2177 
28a0: 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23 64  and #2189..*/.#d
28b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
28c0: 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30 31  D_EQ     0x00001
28d0: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  000  /* rowid=EX
28e0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
28f0: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
2900: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
2910: 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f  E  0x00002000  /
2920: 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64  * rowid<EXPR and
2930: 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a  /or rowid>EXPR *
2940: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2950: 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30  COLUMN_EQ    0x0
2960: 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45 58  0010000  /* x=EX
2970: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
2980: 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   or x IS NULL */
2990: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
29a0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
29b0: 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58 50  020000  /* x<EXP
29c0: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
29d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
29e0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
29f0: 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20 49  00040000  /* x I
2a00: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2a10: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
2a20: 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30 30  NULL  0x00080000
2a30: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
2a40: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2a50: 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78 30  INDEXED      0x0
2a60: 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79 74  00f0000  /* Anyt
2a70: 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20 61  hing that uses a
2a80: 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69  n index */.#defi
2a90: 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c  ne WHERE_NOT_FUL
2aa0: 4c 53 43 41 4e 20 30 78 31 30 30 66 33 30 30 30  LSCAN 0x100f3000
2ab0: 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64 6f    /* Does not do
2ac0: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
2ad0: 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  an */.#define WH
2ae0: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
2af0: 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a 20   0x000f1000  /* 
2b00: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
2b10: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
2b20: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2b30: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
2b40: 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0100000  /* x<EX
2b50: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
2b60: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2b70: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
2b80: 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30 30  MIT    0x0020000
2b90: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
2ba0: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
2bb0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
2bc0: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
2bd0: 20 30 78 30 30 33 30 30 30 30 30 20 20 2f 2a 20   0x00300000  /* 
2be0: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
2bf0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
2c00: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
2c10: 20 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20       0x00800000 
2c20: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
2c30: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
2c40: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2c50: 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 30 78  _ORDERBY      0x
2c60: 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f 75 74  01000000  /* Out
2c70: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
2c80: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
2c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2ca0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 30  E_REVERSE      0
2cb0: 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20 53 63  x02000000  /* Sc
2cc0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
2cd0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2ce0: 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20  HERE_UNIQUE     
2cf0: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d00: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
2d10: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
2d20: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2d30: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2d40: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2d50: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2d60: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2d70: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2d80: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2d90: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2da0: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2db0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2dc0: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2dd0: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2de0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2df0: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e00: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e10: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2e20: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2e30: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 0a  or DISTINCT */..
2e40: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2e50: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2e60: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2e70: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
2e80: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2e90: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
2ea0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
2eb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
2ec0: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
2ed0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73  alized */.  Pars
2ee0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2f00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2f10: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2f20: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
2f30: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
2f40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
2f50: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20  o bitmasks */.  
2f60: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68           /* Migh
2f80: 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f  t include WHERE_
2f90: 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  AND_ONLY */.){. 
2fa0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2fb0: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2fc0: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2fd0: 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  t;.  pWC->pOuter
2fe0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
2ff0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
3000: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
3010: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
3020: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
3030: 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e  aStatic;.  pWC->
3040: 76 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43  vmask = 0;.  pWC
3050: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
3060: 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a  ctrlFlags;.}../*
3070: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3080: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3090: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
30a0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
30b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
30c0: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
30d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
30e0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
30f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3100: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
3110: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
3120: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
3130: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
3140: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
3150: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3160: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3170: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3180: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3190: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
31a0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
31b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
31c0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
31d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
31e0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
31f0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
3200: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
3210: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
3230: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
3240: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
3250: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3260: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
3270: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
3280: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
3290: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
32a0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
32b0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
32c0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
32d0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
32e0: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
32f0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
3300: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3310: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
3320: 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  b;.  for(i=pWC->
3330: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
3340: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
3350: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77  +){.    if( a->w
3360: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
3370: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
3380: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3390: 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a  (db, a->pExpr);.
33a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d      }.    if( a-
33b0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
33c0: 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  ORINFO ){.      
33d0: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
33e0: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e  e(db, a->u.pOrIn
33f0: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
3400: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3410: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a  TERM_ANDINFO ){.
3420: 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e        whereAndIn
3430: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3440: 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20  u.pAndInfo);.   
3450: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43   }.  }.  if( pWC
3460: 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  ->a!=pWC->aStati
3470: 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
3480: 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e  DbFree(db, pWC->
3490: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
34a0: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
34b0: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
34c0: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
34d0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
34e0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
34f0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
3500: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
3510: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
3520: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
3530: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
3540: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
3550: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
3560: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
3570: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
3580: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
3590: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
35a0: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
35b0: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
35c0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
35d0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
35e0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
35f0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
3600: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
3610: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
3620: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
3630: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
3640: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
3650: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3660: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
3670: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
3680: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
3690: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
36a0: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
36b0: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
36c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
36d0: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
36e0: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
36f0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
3700: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
3710: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
3720: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
3730: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
3740: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
3750: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
3760: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
3770: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
3780: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
3790: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
37a0: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
37b0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
37c0: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
37d0: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
37e0: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
37f0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
3800: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
3810: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
3820: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
3830: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
3840: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
3850: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3860: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
3870: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
3880: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
3890: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
38a0: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
38b0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
38c0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
38d0: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
38e0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
38f0: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31  ;  /* EV: R-0021
3900: 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28  1-15100 */.  if(
3910: 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43   pWC->nTerm>=pWC
3920: 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57  ->nSlot ){.    W
3930: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d  hereTerm *pOld =
3940: 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c   pWC->a;.    sql
3950: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
3960: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
3970: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
3980: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
3990: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
39a0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
39b0: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
39c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
39d0: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
39e0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
39f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3a00: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
3a10: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
3a20: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
3a30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3a40: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
3a50: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
3a60: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
3a70: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
3a80: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
3a90: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
3aa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
3ab0: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
3ac0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
3ad0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
3ae0: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
3af0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
3b00: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
3b10: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
3b20: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
3b30: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20  m->pExpr = p;.  
3b40: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
3b50: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
3b60: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
3b70: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
3b80: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
3b90: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
3ba0: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
3bb0: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
3bc0: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
3bd0: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
3be0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
3bf0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
3c00: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
3c10: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
3c20: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
3c30: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
3c40: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
3c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
3c60: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
3c70: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
3c80: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
3c90: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
3ca0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
3cb0: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
3cc0: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
3cd0: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
3ce0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
3cf0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
3d00: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
3d10: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
3d20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
3d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
3d40: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
3d50: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
3d60: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
3d70: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
3d80: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
3d90: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
3da0: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
3db0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
3dc0: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
3dd0: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
3de0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
3df0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
3e00: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
3e10: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
3e20: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
3e30: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
3e40: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
3e50: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
3e60: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
3e70: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
3e80: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
3e90: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
3ea0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
3eb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
3ec0: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
3ed0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3ee0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
3ef0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
3f00: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
3f10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3f20: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
3f30: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
3f40: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
3f50: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
3f60: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
3f70: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
3f80: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
3f90: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
3fa0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
3fb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3fc0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
3fd0: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
3fe0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
3ff0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
4000: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
4010: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
4020: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
4030: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4040: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4050: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4060: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4070: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4080: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4090: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
40a0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
40b0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
40c0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
40d0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
40e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
40f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
4100: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
4110: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
4120: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
4130: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4140: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4150: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4160: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4170: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4190: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
41a0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
41b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
41c0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
41d0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
41e0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
41f0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
4200: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
4210: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
4220: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
4230: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4240: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4250: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4260: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4270: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4280: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4290: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
42a0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
42b0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
42c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
42d0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
42e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
42f0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
4300: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
4310: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
4320: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
4330: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4340: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4350: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4360: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4370: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4380: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4390: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
43a0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
43b0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
43c0: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
43d0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
43e0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
43f0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4400: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4410: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4420: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4430: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4440: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4450: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4460: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4470: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4480: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4490: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
44a0: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
44b0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
44c0: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
44d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
44e0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
44f0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4500: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4510: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4520: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4530: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4540: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4550: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4560: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4570: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4580: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4590: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
45a0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
45b0: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
45c0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
45d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
45e0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
45f0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4600: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4610: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4620: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4630: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4640: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4650: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4660: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4670: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4680: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4690: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
46a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
46b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
46c0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
46d0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
46e0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
46f0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4700: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4720: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4730: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4740: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4750: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4760: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4770: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4780: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4790: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
47a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
47b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
47c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
47d0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
47e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
47f0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4800: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4810: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4820: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4830: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4840: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4850: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4860: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4870: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4880: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4890: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
48a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
48b0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
48c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
48d0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
48e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
48f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4900: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4910: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4920: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4930: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4940: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4950: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4960: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4970: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
4980: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
4990: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
49a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
49b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
49c0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
49d0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
49e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
49f0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
4a00: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4a10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4a20: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
4a30: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4a40: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4a50: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
4a60: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
4a70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4a80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4a90: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
4aa0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
4ab0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
4ac0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ad0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
4ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
4af0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
4b00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4b10: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
4b20: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
4b30: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4b40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4b50: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
4b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4b70: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4b80: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4b90: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4ba0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4bb0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
4bc0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
4bd0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
4be0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
4bf0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
4c00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4c10: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4c20: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4c30: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4c40: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4c50: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4c60: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4c70: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4c80: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4c90: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4ca0: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4cb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
4cc0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
4cd0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4ce0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
4cf0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
4d00: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
4d10: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4d20: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4d30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4d40: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d50: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4d60: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4d70: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4d80: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d90: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4da0: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4db0: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4dc0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4dd0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4df0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4e00: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4e10: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4e20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e30: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4e40: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4e50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4e60: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4e70: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e80: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4ea0: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4eb0: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ec0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4ed0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4ee0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4ef0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4f00: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4f10: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4f20: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4f30: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4f40: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4f50: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4f60: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4f70: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4f80: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4f90: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4fa0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4fb0: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4fc0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4fd0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4fe0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4ff0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
5000: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
5010: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
5020: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
5030: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
5040: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
5050: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
5060: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
5070: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
5080: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
5090: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
50a0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
50b0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
50c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
50d0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
50e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
50f0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
5100: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
5110: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
5120: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
5130: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
5140: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
5150: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
5160: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5170: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
5180: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
5190: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
51a0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
51b0: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
51c0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
51d0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
51e0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
51f0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
5200: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
5210: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
5220: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
5230: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
5240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5250: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5260: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
5270: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
5280: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5290: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
52a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
52b0: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
52c0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
52d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
52e0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
52f0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
5300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
5310: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5320: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5330: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5340: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5350: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5360: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5370: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5380: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5390: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
53a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
53b0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
53c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
53d0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
53e0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
53f0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
5400: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
5410: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5420: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5430: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5440: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5450: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5460: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5470: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5480: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5490: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
54a0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
54b0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
54c0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
54d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
54e0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
54f0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
5500: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
5510: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5520: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5530: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5540: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5550: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5560: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5570: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5580: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5590: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
55a0: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
55b0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
55c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
55d0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
55e0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
55f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5600: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
5610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5620: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5630: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5640: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5650: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5660: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5670: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5680: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5690: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
56a0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
56b0: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
56c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
56d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
56e0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
56f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5700: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
5710: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5720: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5730: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5740: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5750: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5760: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5770: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5780: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5790: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
57a0: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
57b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
57c0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
57d0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
57e0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
57f0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
5800: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5810: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5820: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5830: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5840: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5850: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5860: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5870: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5880: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5890: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
58a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
58b0: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
58c0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
58d0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
58e0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5900: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
5910: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5920: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5930: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5940: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5950: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5960: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5970: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5980: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5990: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
59a0: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
59b0: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
59c0: 20 66 6f 72 28 3b 20 70 57 43 3b 20 70 57 43 3d   for(; pWC; pWC=
59d0: 70 57 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  pWC->pOuter){.  
59e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
59f0: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
5a00: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
5a10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
5a20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5a30: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 26  =iCur.         &
5a40: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
5a50: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
5a60: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
5a70: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5a80: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
5a90: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
5aa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70  ->eOperator & op
5ab0: 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
5ac0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
5ad0: 6e 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20  n>=0 && pIdx && 
5ae0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
5af0: 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  !=WO_ISNULL ){. 
5b00: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
5b10: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
5b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
5b30: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
5b40: 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
5b50: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
5b60: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 50 61   j;.          Pa
5b70: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
5b80: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 0a 20 20  C->pParse;.  .  
5b90: 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d          idxaff =
5ba0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
5bb0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
5bc0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
5bd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
5be0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
5bf0: 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69   idxaff) ) conti
5c00: 6e 75 65 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  nue;.  .        
5c10: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5c20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
5c30: 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20  quence required 
5c40: 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f  from an index fo
5c50: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  r.          ** i
5c60: 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66  t to be useful f
5c70: 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78  or optimising ex
5c80: 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f  pression pX. Sto
5c90: 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  re this.        
5ca0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
5cb0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
5cc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5cd0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
5ce0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
5cf0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
5d00: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
5d10: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
5d20: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
5d30: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
5d40: 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20  assert(pColl || 
5d50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 20  pParse->nErr);. 
5d60: 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28   .          for(
5d70: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
5d80: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
5d90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5da0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d     if( NEVER(j>=
5db0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
5dc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5de0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71   if( pColl && sq
5df0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
5e00: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
5e10: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
5e20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5e30: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
5e40: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
5e50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
5e70: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5e80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5e90: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
5ea0: 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c  *, WhereClause*,
5eb0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   int);../*.** Ca
5ec0: 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f  ll exprAnalyze o
5ed0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61  n all terms in a
5ee0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
5ef0: 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .**.**.*/.static
5f00: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
5f10: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
5f20: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
5f30: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
5f40: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
5f50: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
5f60: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
5f70: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
5f80: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
5f90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
5fa0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
5fb0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
5fc0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
5fd0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
5fe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5ff0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
6000: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
6010: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6020: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
6030: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
6040: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
6050: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
6060: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
6070: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
6080: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
6090: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
60a0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
60b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
60c0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
60d0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
60e0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
60f0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
6100: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
6110: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
6120: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
6130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
6140: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
6150: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6160: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
6170: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
6180: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
6190: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
61a0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
61b0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
61c0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
61d0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
61e0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
61f0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
6200: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
6210: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
6220: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
6230: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
6240: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
6250: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
6260: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
6270: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
6280: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
6290: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
62a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
62b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
62c0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
62d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
62e0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
62f0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
6300: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
6310: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
6320: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
6330: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
6340: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6350: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
6360: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
6370: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6390: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
63a0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
63b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
63c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
63d0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
63e0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
63f0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
6400: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
6410: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
6420: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
6430: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6440: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
6450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6460: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
6470: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
6480: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
6490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
64a0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
64b0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
64c0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
64d0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
64e0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
64f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
6500: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
6510: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
6520: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
6530: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
6540: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6550: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
6560: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
6570: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
6580: 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65  COLUMN || sqlite
6590: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
65a0: 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46  eft)!=SQLITE_AFF
65b0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _TEXT ){.    /* 
65c0: 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34  IMP: R-02065-494
65d0: 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  65 The left-hand
65e0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b   side of the LIK
65f0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
6600: 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  or must.    ** b
6610: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  e the name of an
6620: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
6630: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69  with TEXT affini
6640: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
6650: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 0;.  }.  asser
6660: 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  t( pLeft->iColum
6670: 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65  n!=(-1) ); /* Be
6680: 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20  cause IPK never 
6690: 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a  has AFF_TEXT */.
66a0: 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73  .  pRight = pLis
66b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
66c0: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
66d0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
66e0: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f  EGISTER ){.    o
66f0: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b  p = pRight->op2;
6700: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
6710: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
6720: 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61    Vdbe *pReprepa
6730: 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65  re = pParse->pRe
6740: 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74  prepare;.    int
6750: 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e   iCol = pRight->
6760: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61  iColumn;.    pVa
6770: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  l = sqlite3VdbeG
6780: 65 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61  etValue(pReprepa
6790: 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45  re, iCol, SQLITE
67a0: 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20  _AFF_NONE);.    
67b0: 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
67c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
67d0: 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Val)==SQLITE_TEX
67e0: 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28  T ){.      z = (
67f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
6800: 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b  alue_text(pVal);
6810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6820: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
6830: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
6840: 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  iCol);.    asser
6850: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
6860: 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52  K_VARIABLE || pR
6870: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ight->op==TK_REG
6880: 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65  ISTER );.  }else
6890: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
68a0: 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52  NG ){.    z = pR
68b0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
68c0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20    }.  if( z ){. 
68d0: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
68e0: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
68f0: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
6900: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
6910: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
6920: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
6930: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
6940: 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d   255!=(u8)z[cnt-
6950: 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  1] ){.      Expr
6960: 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20   *pPrefix;.     
6970: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
6980: 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  c==wc[0] && z[cn
6990: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70  t+1]==0;.      p
69a0: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
69b0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49  Expr(db, TK_STRI
69c0: 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  NG, z);.      if
69d0: 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65  ( pPrefix ) pPre
69e0: 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e  fix->u.zToken[cn
69f0: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  t] = 0;.      *p
6a00: 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69  pPrefix = pPrefi
6a10: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  x;.      if( op=
6a20: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6a30: 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
6a40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a60: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76  VdbeSetVarmask(v
6a70: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
6a80: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
6a90: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20  *pisComplete && 
6aa0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
6ab0: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
6ac0: 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f   /* If the rhs o
6ad0: 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65  f the LIKE expre
6ae0: 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61  ssion is a varia
6af0: 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ble, and the cur
6b00: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
6b10: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76  * value of the v
6b20: 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68  ariable means th
6b30: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
6b40: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b  o invoke the LIK
6b50: 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  E.          ** f
6b60: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f  unction, then no
6b70: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c   OP_Variable wil
6b80: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
6b90: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20  e program..     
6ba0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75       ** This cau
6bb0: 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72  ses problems for
6bc0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
6bd0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
6be0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ().          ** 
6bf0: 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75  API. To workarou
6c00: 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64  nd them, add a d
6c10: 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65  ummy OP_Variable
6c20: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20   here..         
6c30: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69   */ .          i
6c40: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6c50: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6c60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6c70: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
6c80: 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  et(pParse, pRigh
6c90: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t, r1);.        
6ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6cb0: 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33  ngeP3(v, sqlite3
6cc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6cd0: 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  v)-1, 0);.      
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
6cf0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6d00: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
6d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6d20: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b  se{.      z = 0;
6d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6d40: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
6d50: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Val);.  return (
6d60: 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  z!=0);.}.#endif 
6d70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
6d80: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
6d90: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
6da0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6db0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
6dc0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6dd0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
6de0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
6df0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
6e00: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
6e10: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
6e20: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
6e30: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
6e40: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
6e50: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
6e60: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
6e70: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
6e80: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
6e90: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
6ea0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
6eb0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
6ec0: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
6ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6ee0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6ef0: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6f00: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6f10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6f20: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
6f30: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6f40: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
6f50: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
6f60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6f70: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6f80: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
6f90: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
6fa0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6fb0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
6fc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6fd0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
6fe0: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
6ff0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
7000: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
7010: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
7020: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
7030: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
7040: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
7050: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
7060: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
7070: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
7080: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
7090: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
70a0: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
70b0: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
70c0: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
70d0: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
70e0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
70f0: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
7100: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
7110: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
7120: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
7130: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
7140: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7150: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
7160: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65  .** Analyze a te
7170: 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  rm that consists
7180: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
7190: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  OR-connected.** 
71a0: 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e  subterms.  So in
71b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  :.**.**     ... 
71c0: 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44  WHERE  (a=5) AND
71d0: 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20   (b=7 OR c=9 OR 
71e0: 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29  d=13) AND (d=13)
71f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
7210: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
7220: 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ^.**.** This rou
7230: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65  tine analyzes te
7240: 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20  rms such as the 
7250: 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74  middle term in t
7260: 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65  he above example
7270: 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65  ..** A WhereOrTe
7280: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d  rm object is com
7290: 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68  puted and attach
72a0: 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75  ed to the term u
72b0: 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  nder.** analysis
72c0: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
72d0: 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74  the outcome of t
72e0: 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65  he analysis.  He
72f0: 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  nce:.**.**     W
7300: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
7310: 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e     |=  TERM_ORIN
7320: 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  FO.**     WhereT
7330: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d  erm.u.pOrInfo  =
7340: 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20    a dynamically 
7350: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f  allocated WhereO
7360: 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a  rTerm object.**.
7370: 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  ** The term bein
7380: 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20  g analyzed must 
7390: 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  have two or more
73a0: 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64   of OR-connected
73b0: 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20   subterms..** A 
73c0: 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d  single subterm m
73d0: 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66  ight be a set of
73e0: 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73   AND-connected s
73f0: 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ub-subterms..** 
7400: 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d  Examples of term
7410: 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73  s under analysis
7420: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20  :.**.**     (A) 
7430: 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52      t1.x=t2.y OR
7440: 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31   t1.x=t2.z OR t1
7450: 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33  .y=15 OR t1.z=t3
7460: 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20  .a+5.**     (B) 
7470: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65      x=expr1 OR e
7480: 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72  xpr2=x OR x=expr
7490: 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20  3.**     (C)    
74a0: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74   t1.x=t2.y OR (t
74b0: 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e  1.x=t2.z AND t1.
74c0: 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29  y=15).**     (D)
74d0: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
74e0: 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41  (y>11 AND y<22 A
74f0: 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c  ND z LIKE '*hell
7500: 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20  o*').**     (E) 
7510: 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71      (p.a=1 AND q
7520: 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20  .b=2 AND r.c=3) 
7530: 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e  OR (p.x=4 AND q.
7540: 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a  y=5 AND r.z=6).*
7550: 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a  *.** CASE 1:.**.
7560: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7570: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
7580: 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20  rm T.C=expr for 
7590: 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75  some single colu
75a0: 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e  mn of C.** a sin
75b0: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
75c0: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
75d0: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
75e0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
75f0: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
7600: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
7610: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
7620: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
7630: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
7640: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
7650: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
7660: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
7670: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
7680: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
7690: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
76a0: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
76b0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
76c0: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
76d0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
76e0: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
76f0: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
7700: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
7710: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
7720: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
7730: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
7740: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
7750: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
7760: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7770: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
7780: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
7790: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
77a0: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
77b0: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
77c0: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
77d0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
77e0: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
77f0: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
7800: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
7810: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
7820: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
7830: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
7840: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
7850: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
7860: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
7870: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
7880: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
7890: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
78a0: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
78b0: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
78c0: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
78d0: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
78e0: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
78f0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7900: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
7910: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
7920: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
7930: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
7940: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
7950: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
7960: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
7970: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
7980: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
7990: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
79a0: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
79b0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
79c0: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
79d0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
79e0: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
79f0: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
7a00: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
7a10: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
7a20: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
7a30: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
7a40: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
7a50: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
7a60: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
7a70: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
7a80: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
7a90: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
7aa0: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
7ab0: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
7ac0: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
7ad0: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
7ae0: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
7af0: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
7b00: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
7b10: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
7b20: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
7b30: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
7b40: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
7b50: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
7b60: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
7b70: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
7b80: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
7b90: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
7ba0: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
7bb0: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
7bc0: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
7bd0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
7be0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
7bf0: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
7c00: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
7c10: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
7c20: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
7c30: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
7c40: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
7c50: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
7c60: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
7c70: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
7c80: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
7c90: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
7ca0: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
7cb0: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
7cc0: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
7cd0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
7ce0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
7cf0: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
7d00: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
7d10: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
7d20: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
7d30: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
7d40: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
7d50: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
7d60: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
7d70: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
7d80: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
7d90: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
7da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7db0: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
7dc0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
7de0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7df0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7e00: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
7e10: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
7e20: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
7e30: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7e50: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
7e60: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7e70: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
7e80: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
7e90: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
7ea0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7eb0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
7ec0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ee0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7ef0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7f00: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7f10: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7f20: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7f30: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7f40: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7f50: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7f70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7f80: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
7f90: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7fa0: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
7fb0: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
7fc0: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
7fd0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8000: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
8010: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
8020: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
8030: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
8040: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
8050: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
8060: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
8070: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
8080: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
8090: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
80a0: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
80b0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
80c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
80d0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
80e0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
80f0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
8100: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
8110: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
8120: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
8130: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
8140: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
8150: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
8160: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
8170: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
8180: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
8190: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
81a0: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
81b0: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
81c0: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
81d0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
81e0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
81f0: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
8200: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
8210: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
8220: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
8230: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
8240: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
8250: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
8260: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
8270: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
8280: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
8290: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
82a0: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
82b0: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
82c0: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
82d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
82e0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
82f0: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
8300: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
8310: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
8320: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
8330: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
8340: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
8350: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
8360: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
8370: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
8380: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 77 68  ctrlFlags);.  wh
8390: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
83a0: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
83b0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
83c0: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
83d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
83e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
83f0: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
8400: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
8410: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
8420: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
8430: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
8440: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
8450: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
8460: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
8470: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8480: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
8490: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
84a0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
84b0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
84c0: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
84d0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
84e0: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
84f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8500: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
8510: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
8520: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
8530: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8540: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
8550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
8560: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8570: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8580: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
8590: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
85a0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
85b0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
85c0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
85d0: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
85e0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
85f0: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8600: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
8610: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
8620: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
8630: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
8640: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
8650: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
8660: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
8670: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8680: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8690: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
86a0: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
86b0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
86c0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
86d0: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
86e0: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
86f0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8700: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
8710: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
8720: 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77 63 74  askSet, pWC->wct
8730: 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  rlFlags);.      
8740: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e    whereSplit(pAn
8750: 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  dWC, pOrTerm->pE
8760: 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  xpr, TK_AND);.  
8770: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
8780: 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57  eAll(pSrc, pAndW
8790: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  C);.        pAnd
87a0: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43  WC->pOuter = pWC
87b0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
87c0: 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
87d0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
87e0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
87f0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
8800: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64     for(j=0, pAnd
8810: 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20  Term=pAndWC->a; 
8820: 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b  j<pAndWC->nTerm;
8830: 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b   j++, pAndTerm++
8840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
8850: 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d  ssert( pAndTerm-
8860: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
8870: 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65        if( allowe
8880: 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45  dOp(pAndTerm->pE
8890: 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20  xpr->op) ){.    
88a0: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
88b0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
88c0: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
88d0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
88e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
88f0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8900: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
8910: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8920: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
8930: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8940: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
8950: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
8960: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
8970: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
8980: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
8990: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
89a0: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
89b0: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
89c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
89d0: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
89e0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
89f0: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
8a00: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8a10: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
8a20: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8a30: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
8a40: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
8a50: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
8a60: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
8a70: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
8a80: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
8a90: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
8aa0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
8ab0: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
8ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
8ad0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
8ae0: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  WO_EQ ){.       
8af0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
8b00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8b10: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
8b20: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
8b30: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
8b40: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
8b50: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
8b60: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
8b70: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
8b80: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
8b90: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
8ba0: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
8bb0: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
8bc0: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
8bd0: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
8be0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
8bf0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
8c00: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
8c10: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
8c20: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
8c30: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
8c40: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
8c50: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
8c60: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
8c70: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
8c80: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
8c90: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
8ca0: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
8cb0: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
8cc0: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
8cd0: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
8ce0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
8cf0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
8d00: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
8d10: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
8d20: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
8d30: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
8d40: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
8d50: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
8d60: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
8d70: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
8d80: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
8d90: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
8da0: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
8db0: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
8dc0: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
8dd0: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
8de0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
8df0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
8e00: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
8e10: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
8e20: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
8e30: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
8e40: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
8e50: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
8e60: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
8e70: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
8e80: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
8e90: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
8ea0: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
8eb0: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
8ec0: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
8ed0: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
8ee0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
8ef0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
8f00: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
8f10: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
8f20: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
8f30: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8f40: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8f50: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8f60: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
8f70: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
8f80: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
8f90: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
8fa0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
8fb0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
8fc0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8fd0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
8fe0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
8ff0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
9000: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
9010: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
9020: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
9030: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
9040: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
9050: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
9060: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
9070: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
9080: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
9090: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
90a0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
90b0: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
90c0: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
90d0: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
90e0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
90f0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
9100: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
9110: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
9120: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
9130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9140: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
9150: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
9160: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
9170: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
9180: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
9190: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
91a0: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
91b0: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
91c0: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
91d0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
91e0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
91f0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
9200: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
9210: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
9220: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
9230: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
9240: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
9250: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
9260: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
9270: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
9280: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
9290: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
92a0: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
92b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
92c0: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
92d0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
92e0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
92f0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
9300: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
9310: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
9320: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9330: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9340: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9350: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9360: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
9370: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
9380: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
9390: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
93a0: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b  rsor==iCursor ){
93b0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
93c0: 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20  is is the 2-bit 
93d0: 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20  case and we are 
93e0: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
93f0: 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  eration and.    
9400: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
9410: 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68   term is from th
9420: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
9430: 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73  n.  So skip this
9440: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   term. */.      
9450: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
9460: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
9470: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
9480: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  }.        if( (c
9490: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
94a0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
94b0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
94c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
94d0: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
94e0: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
94f0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
9500: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
9510: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
9520: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
9530: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
9540: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
9550: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
9560: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
9570: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
9580: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
9590: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
95a0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
95b0: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
95c0: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
95d0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
95e0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
95f0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
9600: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
9610: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
9620: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
9630: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
9640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9650: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9660: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
9670: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
9680: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
9690: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
96a0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
96b0: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
96c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
96d0: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
96e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
96f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9700: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9710: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
9720: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
9730: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
9740: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
9750: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
9760: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
9770: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
9780: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9790: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
97a0: 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f   assert( (chngTo
97b0: 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29  IN&(chngToIN-1))
97c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
97d0: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
97e0: 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  =getMask(pMaskSe
97f0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
9800: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9810: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
9820: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
9830: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
9840: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
9850: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
9860: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
9870: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
9880: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
9890: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
98a0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
98b0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
98c0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
98d0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
98e0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
98f0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
9900: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9910: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9920: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
9930: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
9940: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
9950: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
9960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
9970: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9980: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
9990: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99a0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
99b0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
99c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
99d0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
99f0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
9a00: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
9a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
9a20: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
9a30: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
9a40: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
9a50: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
9a60: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
9a70: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
9a80: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
9a90: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
9aa0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
9ab0: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
9ac0: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
9ad0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
9ae0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
9af0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
9b00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9b10: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
9b20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9b30: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
9b40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9b50: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9b60: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
9b70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
9b80: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
9b90: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
9ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
9bb0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9bc0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
9be0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
9bf0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
9c00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9c10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9c20: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
9c30: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
9c40: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
9c50: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
9c60: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
9c70: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
9c80: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
9c90: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
9ca0: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
9cb0: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
9cc0: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
9cd0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a  perator..    **.
9ce0: 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32      ** EV: R-002
9cf0: 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a  11-15100.    */.
9d00: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
9d10: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
9d20: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
9d30: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
9d40: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
9d50: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9d60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9d70: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
9d80: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
9d90: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9da0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
9db0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
9dc0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
9dd0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
9de0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
9e00: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
9e10: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
9e20: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
9e30: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
9e40: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
9e50: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9e60: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
9e70: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
9e80: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
9e90: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
9ea0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
9eb0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
9ec0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9ed0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9ee0: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9ef0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9f00: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9f10: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
9f20: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
9f30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9f40: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
9f50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29  Expr->pRight, 0)
9f60: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
9f70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9f80: 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61  tAppend(pWC->pPa
9f90: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
9fa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
9fb0: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
9fc0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
9fd0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9fe0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
9ff0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
a000: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
a010: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
a020: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
a030: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
a040: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
a050: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
a060: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
a070: 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73  w;.        trans
a080: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
a090: 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
a0a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
a0b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a0c0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
a0d0: 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  t) );.        pN
a0e0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
a0f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
a100: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
a110: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
a120: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
a130: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
a140: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a150: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
a160: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
a170: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
a180: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
a190: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a1a0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
a1b0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
a1c0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
a1d0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
a1e0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
a1f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a200: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a210: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
a220: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
a230: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
a240: 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f  or = WO_NOOP;  /
a250: 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20  * case 1 trumps 
a260: 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a  case 2 */.    }.
a270: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
a280: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  !SQLITE_OMIT_OR_
a290: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20  OPTIMIZATION && 
a2a0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  !SQLITE_OMIT_SUB
a2b0: 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  QUERY */.../*.**
a2c0: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
a2d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
a2e0: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
a2f0: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
a300: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
a310: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
a320: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
a330: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
a340: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
a350: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
a360: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
a370: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
a380: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
a390: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
a3a0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
a3b0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
a3c0: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
a3d0: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
a3e0: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
a3f0: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
a400: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
a410: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a420: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a430: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
a440: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
a450: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
a460: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
a470: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
a480: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
a490: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
a4a0: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
a4b0: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
a4c0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
a4d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
a4e0: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
a4f0: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
a500: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
a510: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
a520: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
a530: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
a540: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
a550: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
a560: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
a570: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
a580: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
a590: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
a5a0: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
a5b0: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
a5c0: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
a5d0: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
a5e0: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
a5f0: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
a600: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
a610: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
a620: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a630: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
a640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
a650: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
a660: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
a670: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
a680: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
a690: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
a6a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
a6b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
a6c0: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6e0: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
a6f0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
a700: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
a710: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a730: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a740: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
a750: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
a760: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
a770: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
a780: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
a790: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
a7c0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a7d0: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
a7e0: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
a7f0: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
a800: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
a810: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
a820: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a840: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a850: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
a860: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
a870: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
a880: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
a890: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
a8a0: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
a8b0: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
a8c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
a8d0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
a8e0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
a8f0: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
a900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
a910: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
a920: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
a930: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
a940: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a950: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
a960: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
a970: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
a980: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9a0: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
a9b0: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
a9c0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
a9d0: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
a9e0: 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ;     /* Parsing
a9f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
aa00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
aa10: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
aa20: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
aa30: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
aa40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
aa50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
aa60: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
aa70: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
aa80: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43    pMaskSet = pWC
aa90: 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->pMaskSet;.  pE
aaa0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
aab0: 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  pr;.  prereqLeft
aac0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
aad0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
aae0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
aaf0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
ab00: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
ab10: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ab20: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
ab30: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
ab40: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ab50: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
ab60: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
ab70: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
ab80: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
ab90: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
aba0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
abb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
abc0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
abd0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
abe0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
abf0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
ac00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ac10: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
ac20: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
ac30: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
ac40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
ac50: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ac60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ac70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ac80: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
ac90: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
aca0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
acb0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
acc0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
acd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
ace0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
acf0: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
ad00: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
ad10: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
ad20: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
ad30: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
ad40: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
ad50: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
ad60: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
ad70: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
ad80: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
ad90: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
ada0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
adb0: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
adc0: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
add0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
ade0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
adf0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ae00: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
ae10: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
ae20: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
ae30: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
ae40: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20 28  lowedOp(op) && (
ae50: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
ae60: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
ae70: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
ae80: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
ae90: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
aea0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
aeb0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
aec0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
aed0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
aee0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
aef0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
af00: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
af10: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
af20: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
af30: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
af40: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
af50: 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  ask(op);.    }. 
af60: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
af70: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
af80: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
af90: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
afa0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
afb0: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  p;.      if( pTe
afc0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
afd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
afe0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
aff0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
b000: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b010: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b020: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b030: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
b040: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b050: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
b060: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
b070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b080: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b090: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b0a0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
b0b0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b0c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b0d0: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
b0e0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
b0f0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
b100: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
b110: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
b120: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
b130: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b140: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
b150: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
b160: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
b170: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
b180: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65  COPIED;.      }e
b190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
b1a0: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
b1b0: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
b1c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
b1d0: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
b1e0: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
b1f0: 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c  pLeft = pDup->pL
b200: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
b210: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
b220: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
b230: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
b240: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
b250: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
b260: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
b270: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
b280: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
b290: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
b2a0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
b2b0: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
b2c0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
b2d0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
b2e0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
b2f0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
b300: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
b310: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
b320: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b330: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
b340: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
b350: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
b360: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
b370: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
b380: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
b390: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
b3a0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
b3b0: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
b3c0: 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65  plements.  For e
b3d0: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
b3e0: 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e  *      a BETWEEN
b3f0: 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20   b AND c.  **.  
b400: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
b410: 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
b420: 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20       (a BETWEEN 
b430: 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e  b AND c) AND (a>
b440: 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20  =b) AND (a<=c). 
b450: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f   **.  ** The two
b460: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61   new terms are a
b470: 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  dded onto the en
b480: 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c  d of the WhereCl
b490: 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  ause object..  *
b4a0: 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20  * The new terms 
b4b0: 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e  are "dynamic" an
b4c0: 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f  d are children o
b4d0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42  f the original B
b4e0: 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d  ETWEEN.  ** term
b4f0: 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
b500: 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45  at if the BETWEE
b510: 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c  N term is coded,
b520: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
b530: 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20  e.  ** skipped. 
b540: 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c   Or, if the chil
b550: 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69  dren are satisfi
b560: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20  ed by an index, 
b570: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
b580: 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  * BETWEEN term i
b590: 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  s skipped..  */.
b5a0: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
b5b0: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
b5c0: 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f   && pWC->op==TK_
b5d0: 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  AND ){.    ExprL
b5e0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b5f0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
b600: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
b610: 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b  ic const u8 ops[
b620: 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c  ] = {TK_GE, TK_L
b630: 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E};.    assert( 
b640: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
b650: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
b660: 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66  Expr==2 );.    f
b670: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
b680: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b690: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69  NewExpr;.      i
b6a0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
b6b0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b6c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b6d0: 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20   ops[i], .      
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b700: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d  prDup(db, pExpr-
b710: 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20  >pLeft, 0),.    
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b740: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73  ExprDup(db, pLis
b750: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30  t->a[i].pExpr, 0
b760: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
b770: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
b780: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b790: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
b7a0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b7b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b7c0: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
b7d0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
b7e0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
b7f0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
b800: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b810: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
b820: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
b830: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b840: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
b850: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
b860: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b870: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
b880: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b890: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b8a0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
b8b0: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
b8c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b8d0: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
b8e0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
b8f0: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
b900: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
b910: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
b920: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
b930: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
b940: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
b950: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
b960: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
b970: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
b980: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
b990: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
b9a0: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
b9b0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
b9c0: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
b9d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
b9e0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
b9f0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ba00: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
ba10: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
ba20: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
ba30: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
ba40: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
ba50: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
ba60: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
ba70: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
ba80: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
ba90: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
baa0: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
bab0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
bac0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
bad0: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
bae0: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
baf0: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
bb00: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
bb10: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
bb20: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
bb30: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
bb40: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
bb50: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
bb60: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
bb70: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
bb80: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
bb90: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
bba0: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
bbb0: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
bbc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
bbd0: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
bbe0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
bbf0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
bc00: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
bc10: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
bc20: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
bc30: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
bc40: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
bc50: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
bc60: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
bc70: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
bc80: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
bc90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
bca0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e  ;    /* Collatin
bcb0: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73  g sequence to us
bcc0: 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20  e */..    pLeft 
bcd0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
bce0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
bcf0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
bd00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
bd10: 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  r1, 0);.    if( 
bd20: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
bd30: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
bd40: 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c   *pC;       /* L
bd50: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
bd60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
bd70: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20  ildcard */.     
bd80: 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72   pC = (u8*)&pStr
bd90: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69  2->u.zToken[sqli
bda0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72  te3Strlen30(pStr
bdb0: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b  2->u.zToken)-1];
bdc0: 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a  .      c = *pC;.
bdd0: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
bde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
bdf0: 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69  he point is to i
be00: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73  ncrement the las
be10: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
be20: 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  re the first.   
be30: 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64       ** wildcard
be40: 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63  .  But if we inc
be50: 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74  rement '@', that
be60: 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e   will push it in
be70: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
be80: 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e  * alphabetic ran
be90: 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f  ge where case co
bea0: 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d  nversions will m
beb0: 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20  ess up the .    
bec0: 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74      ** inequalit
bed0: 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69  y.  To avoid thi
bee0: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20  s, make sure to 
bef0: 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c  also run the ful
bf00: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b  l.        ** LIK
bf10: 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61  E on all candida
bf20: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  te expressions b
bf30: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69  y clearing the i
bf40: 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20  sComplete flag. 
bf50: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bf60: 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29    if( c=='A'-1 )
bf70: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
bf80: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33     /* EV: R-6433
bf90: 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20  9-08207 */...   
bfa0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
bfb0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
bfc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
bfd0: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
bfe0: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  }.    pColl = sq
bff0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c000: 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
c010: 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  , noCase ? "NOCA
c020: 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c 30  SE" : "BINARY",0
c030: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31  );.    pNewExpr1
c040: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c050: 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a  pParse, TK_GE, .
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c080: 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45  SetColl(sqlite3E
c090: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
c0a0: 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20  0), pColl),.    
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
c0d0: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
c0e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
c0f0: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
c100: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c110: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
c120: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
c130: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
c140: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c150: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
c160: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
c170: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c180: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
c190: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c1a0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c  3ExprSetColl(sql
c1b0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
c1c0: 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c  Left,0), pColl),
c1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c1e0: 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b        pStr2, 0);
c1f0: 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
c200: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
c210: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
c220: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c230: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
c240: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
c250: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
c260: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
c270: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
c280: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c290: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c2a0: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
c2b0: 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
c2c0: 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
c2d0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c2e0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
c2f0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
c300: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
c310: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
c320: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
c340: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
c350: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
c360: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c370: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
c380: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
c390: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
c3a0: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
c3b0: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
c3c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
c3d0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
c3e0: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
c3f0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
c400: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
c410: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
c420: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
c430: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
c440: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
c450: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
c460: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
c470: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
c480: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
c490: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
c4a0: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
c4b0: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
c4c0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
c4d0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
c4e0: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
c4f0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
c500: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
c510: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
c520: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
c530: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
c540: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c550: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
c560: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
c570: 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
c580: 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
c590: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
c5a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
c5b0: 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
c5c0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
c5d0: 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
c5e0: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
c5f0: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
c600: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
c610: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
c620: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
c630: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
c640: 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
c670: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c680: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
c690: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
c6a0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
c6b0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
c6c0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
c6d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
c6e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
c6f0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
c700: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
c710: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
c720: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c730: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
c740: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
c750: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
c760: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
c770: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
c780: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
c790: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c7a0: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
c7b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
c7c0: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
c7d0: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
c7e0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c7f0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c800: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c810: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
c820: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
c830: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c840: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
c850: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
c860: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
c870: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
c880: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c890: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c8a0: 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
c8b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c8c0: 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71  AT3.  /* When sq
c8d0: 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
c8e0: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
c8f0: 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74  ilable an operat
c900: 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  or of the.  ** f
c910: 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55  orm "x IS NOT NU
c920: 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65  LL" can sometime
c930: 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d  s be evaluated m
c940: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a  ore efficiently.
c950: 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22    ** as "x>NULL"
c960: 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20   if x is not an 
c970: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c980: 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75  KEY.  So constru
c990: 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  ct a.  ** virtua
c9a0: 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66  l term of that f
c9b0: 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  orm..  **.  ** N
c9c0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72  ote that the vir
c9d0: 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62  tual term must b
c9e0: 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45  e tagged with TE
c9f0: 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a  RM_VNULL.  This.
ca00: 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20    ** TERM_VNULL 
ca10: 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73  tag will suppres
ca20: 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  s the not-null c
ca30: 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67 69  heck at the begi
ca40: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
ca50: 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74  e loop.  Without
ca60: 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20   the TERM_VNULL 
ca70: 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75  flag, the not-nu
ca80: 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a  ll check at.  **
ca90: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
caa0: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76  e loop will prev
cab0: 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20  ent any results 
cac0: 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72  from being retur
cad0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
cae0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
caf0: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
cb00: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
cb10: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
cb20: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
cb30: 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20 20  umn>=0.  ){.    
cb40: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
cb50: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
cb60: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
cb70: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
cb80: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
cb90: 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e  NewTerm;..    pN
cba0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
cbb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
cbc0: 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GT,.           
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cbf0: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20  db, pLeft, 0),. 
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cc20: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
cc30: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
cc40: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e  ), 0);..    idxN
cc50: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
cc60: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
cc70: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c      TERM_VIRTUAL
cca0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  |TERM_DYNAMIC|TE
ccb0: 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  RM_VNULL);.    i
ccc0: 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20  f( idxNew ){.   
ccd0: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
cce0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
ccf0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cd00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
cd10: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
cd20: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
cd30: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
cd40: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
cd50: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
cd60: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
cd70: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
cd80: 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20  ator = WO_GT;.  
cd90: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
cda0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
cdb0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
cdc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
cdd0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
cde0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
cdf0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
ce00: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
ce10: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
ce20: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
ce30: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
ce40: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
ce50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ce60: 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65  TAT */..  /* Pre
ce70: 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74  vent ON clause t
ce80: 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a  erms of a LEFT J
ce90: 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75  OIN from being u
cea0: 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a  sed to drive.  *
ceb0: 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74  * an index for t
cec0: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
ced0: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  t of the join.. 
cee0: 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65   */.  pTerm->pre
cef0: 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72  reqRight |= extr
cf00: 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aRight;.}../*.**
cf10: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
cf20: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
cf30: 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d  ssions in pList-
cf40: 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f  >a[iFirst...] co
cf50: 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72  ntain.** a refer
cf60: 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c  ence to any tabl
cf70: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  e other than the
cf80: 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f   iBase table..*/
cf90: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 66 65  .static int refe
cfa0: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
cfb0: 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  s(.  ExprList *p
cfc0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f  List,          /
cfd0: 2a 20 53 65 61 72 63 68 20 65 78 70 72 65 73 73  * Search express
cfe0: 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74  ions in ths list
cff0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
d000: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20  et *pMaskSet,   
d010: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
d020: 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70  tables to bitmap
d030: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  s */.  int iFirs
d040: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d050: 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67   /* Be searching
d060: 20 77 69 74 68 20 74 68 65 20 69 46 69 72 73 74   with the iFirst
d070: 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
d080: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20 20  /.  int iBase   
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0a0: 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63   Ignore referenc
d0b0: 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
d0c0: 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b   */.){.  Bitmask
d0d0: 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d   allowed = ~getM
d0e0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42  ask(pMaskSet, iB
d0f0: 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ase);.  while( i
d100: 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78  First<pList->nEx
d110: 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65  pr ){.    if( (e
d120: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
d130: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
d140: 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72  [iFirst++].pExpr
d150: 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b  )&allowed)!=0 ){
d160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d180: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d190: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
d1a0: 61 72 63 68 65 73 20 74 68 65 20 65 78 70 72 65  arches the expre
d1b0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73 73 65  ssion list passe
d1c0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
d1d0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f 72 20  argument.** for 
d1e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  an expression of
d1f0: 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20   type TK_COLUMN 
d200: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 74  that refers to t
d210: 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 61  he same column a
d220: 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 73  nd.** uses the s
d230: 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ame collation se
d240: 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 69 43  quence as the iC
d250: 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol'th column of 
d260: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 20 41  index pIdx..** A
d270: 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20 69 73  rgument iBase is
d280: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
d290: 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  er used for the 
d2a0: 74 61 62 6c 65 20 74 68 61 74 20 70 49 64 78 20  table that pIdx 
d2b0: 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a 2a 2a  refers.** to..**
d2c0: 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65  .** If such an e
d2d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
d2e0: 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e  nd, its index in
d2f0: 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72   pList->a[] is r
d300: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e  eturned. If.** n
d310: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  o expression is 
d320: 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74  found, -1 is ret
d330: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
d340: 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f   int findIndexCo
d350: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
d360: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
d370: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
d380: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
d390: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
d3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
d3b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
d3c0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
d3d0: 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20   iBase,         
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3f0: 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65  Cursor for table
d400: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
d410: 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
d420: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
d430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
d440: 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c  dex to match col
d450: 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  umn of */.  int 
d460: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
d470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d480: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
d490: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
d4a0: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
d4b0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
d4c0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b  x->azColl[iCol];
d4d0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d4e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d4f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
d500: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
d510: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
d520: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
d530: 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
d540: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
d550: 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
d560: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
d570: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
d580: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
d590: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
d5a0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
d5b0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
d5c0: 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
d5d0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
d5e0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
d5f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d600: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
d610: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
d620: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  1;.}../*.** This
d630: 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69   routine determi
d640: 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  nes if pIdx can 
d650: 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73  be used to assis
d660: 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  t in processing 
d670: 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75  a.** DISTINCT qu
d680: 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65  alifier. In othe
d690: 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74  r words, it test
d6a0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
d6b0: 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69   using this.** i
d6c0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74  ndex for the out
d6d0: 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65  er loop guarante
d6e0: 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74  es that rows wit
d6f0: 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66  h equal values f
d700: 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73  or.** all expres
d710: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69  sions in the pDi
d720: 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20  stinct list are 
d730: 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65  delivered groupe
d740: 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  d together..**.*
d750: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  * For example, t
d760: 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20  he query .**.** 
d770: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
d780: 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
d790: 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a  bl WHERE a = ?.*
d7a0: 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74  *.** can benefit
d7b0: 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20   from any index 
d7c0: 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61  on columns "b" a
d7d0: 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69  nd "c"..*/.stati
d7e0: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
d7f0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
d800: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d810: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d820: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d830: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
d840: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
d850: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
d860: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
d870: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
d880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d890: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e   index being con
d8a0: 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  sidered */.  int
d8b0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8d0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
d8e0: 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78  r the table pIdx
d8f0: 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72   is on */.  Expr
d900: 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
d910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d920: 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
d930: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
d940: 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20   nEqCol         
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d960: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
d970: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
d980: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
d990: 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  mask = 0;       
d9a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
d9b0: 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66  of unaccounted f
d9c0: 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70  or pDistinct exp
d9d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rs */.  int i;  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
da00: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
da10: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61  .  if( pIdx->zNa
da20: 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e  me==0 || pDistin
da30: 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e  ct==0 || pDistin
da40: 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29  ct->nExpr>=BMS )
da50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73   return 0;.  tes
da60: 74 63 61 73 65 28 20 70 44 69 73 74 69 6e 63 74  tcase( pDistinct
da70: 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
da80: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  ;..  /* Loop thr
da90: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65 78 70  ough all the exp
daa0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
dab0: 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e 20 49  distinct list. I
dac0: 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20 20  f any of them.  
dad0: 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d 70 6c  ** are not simpl
dae0: 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  e column referen
daf0: 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ces, return earl
db00: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 65  y. Otherwise, te
db10: 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57  st if the.  ** W
db20: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
db30: 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20 63  ains a "col=X" c
db40: 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64 6f 65  lause. If it doe
db50: 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  s, the expressio
db60: 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67  n.  ** can be ig
db70: 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64 6f 65  nored. If it doe
db80: 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20 63  s not, and the c
db90: 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20 62  olumn does not b
dba0: 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a  elong to the.  *
dbb0: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20  * same table as 
dbc0: 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65 74 75  index pIdx, retu
dbd0: 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c 6c  rn early. Finall
dbe0: 79 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  y, if there is n
dbf0: 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20  o.  ** matching 
dc00: 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73 73 69  "col=X" expressi
dc10: 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  on and the colum
dc20: 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  n is on the same
dc30: 20 74 61 62 6c 65 20 61 73 20 70 49 64 78 2c 0a   table as pIdx,.
dc40: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 6f 72    ** set the cor
dc50: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
dc60: 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73 6b 2e  n variable mask.
dc70: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
dc80: 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45   i<pDistinct->nE
dc90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 57  xpr; i++){.    W
dca0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
dcb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
dcc0: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
dcd0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
dce0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
dcf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
dd00: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
dd10: 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20  pWC, p->iTable, 
dd20: 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28 42 69  p->iColumn, ~(Bi
dd30: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
dd40: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  0);.    if( pTer
dd50: 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  m ){.      Expr 
dd60: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
dd70: 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  pr;.      CollSe
dd80: 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65 33 42  q *p1 = sqlite3B
dd90: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
dda0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
ddb0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
ddc0: 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  t);.      CollSe
ddd0: 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65 33 45  q *p2 = sqlite3E
dde0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ddf0: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
de00: 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74 69 6e   p1==p2 ) contin
de10: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
de20: 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  ( p->iTable!=bas
de30: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
de40: 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42 69 74    mask |= (((Bit
de50: 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b 0a 20  mask)1) << i);. 
de60: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45 71 43   }..  for(i=nEqC
de70: 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c 70 49  ol; mask && i<pI
de80: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
de90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78 70 72  ){.    int iExpr
dea0: 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   = findIndexCol(
deb0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
dec0: 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c 20 69  t, base, pIdx, i
ded0: 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78 70 72  );.    if( iExpr
dee0: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
def0: 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69 74 6d  mask &= ~(((Bitm
df00: 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70 72 29  ask)1) << iExpr)
df10: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
df20: 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a 0a 2f  (mask==0);.}.../
df30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
df40: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
df50: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
df60: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
df70: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
df80: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 41   is redundant. A
df90: 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69   DISTINCT list i
dfa0: 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74  s redundant if t
dfb0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
dfc0: 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51 55 45  ains a.** UNIQUE
dfd0: 20 69 6e 64 65 78 20 74 68 61 74 20 67 75 61 72   index that guar
dfe0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 20  antees that the 
dff0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 71 75  result of the qu
e000: 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69 73 74  ery will be dist
e010: 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79 2e 0a  inct.** anyway..
e020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
e030: 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e  DistinctRedundan
e040: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
e050: 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se,.  SrcList *p
e060: 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65 72 65  TabList,.  Where
e070: 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 45  Clause *pWC,.  E
e080: 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
e090: 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ct.){.  Table *p
e0a0: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
e0b0: 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  dx;.  int i;    
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61        .  int iBa
e0e0: 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  se;..  /* If the
e0f0: 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  re is more than 
e100: 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62  one table or sub
e110: 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46  -select in the F
e120: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20  ROM clause of.  
e130: 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ** this query, t
e140: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  hen it will not 
e150: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73  be possible to s
e160: 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53  how that the DIS
e170: 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75  TINCT .  ** clau
e180: 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  se is redundant.
e190: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
e1a0: 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  st->nSrc!=1 ) re
e1b0: 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20  turn 0;.  iBase 
e1c0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
e1d0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62  .iCursor;.  pTab
e1e0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
e1f0: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
e200: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
e210: 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50  essions is an IP
e220: 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c  K column on tabl
e230: 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65  e iBase, then re
e240: 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e  turn .  ** true.
e250: 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69   Note: The (p->i
e260: 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61  Table==iBase) pa
e270: 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  rt of this test 
e280: 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20  may be false if 
e290: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
e2a0: 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72   SELECT is a cor
e2b0: 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72  related sub-quer
e2c0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
e2d0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
e2e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e2f0: 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69 73 74   Expr *p = pDist
e300: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
e310: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
e320: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
e330: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26  >iTable==iBase &
e340: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  & p->iColumn<0 )
e350: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
e360: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
e370: 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e  h all indices on
e380: 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63   the table, chec
e390: 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65  king each to see
e3a0: 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a   if it makes.  *
e3b0: 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  * the DISTINCT q
e3c0: 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61  ualifier redunda
e3d0: 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69  nt. It does so i
e3e0: 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  f:.  **.  **   1
e3f0: 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69  . The index is i
e400: 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e  tself UNIQUE, an
e410: 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  d.  **.  **   2.
e420: 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75   All of the colu
e430: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
e440: 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74   are either part
e450: 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63   of the pDistinc
e460: 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74  t.  **      list
e470: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48  , or else the WH
e480: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
e490: 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ins a term of th
e4a0: 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a  e form "col=X",.
e4b0: 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20    **      where 
e4c0: 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  X is a constant 
e4d0: 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61  value. The colla
e4e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f  tion sequences o
e4f0: 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20  f the.  **      
e500: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73  comparison and s
e510: 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65  elect-list expre
e520: 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63  ssions must matc
e530: 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69  h those of the i
e540: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ndex..  */.  for
e550: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e560: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e570: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e580: 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
e590: 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
e5a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
e5b0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
e5c0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
e5d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
e5e0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
e5f0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e        if( 0==fin
e600: 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65  dTerm(pWC, iBase
e610: 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73  , iCol, ~(Bitmas
e620: 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78  k)0, WO_EQ, pIdx
e630: 29 20 0a 20 20 20 20 20 20 20 26 26 20 30 3e 66  ) .       && 0>f
e640: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
e650: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
e660: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 0a 20  Base, pIdx, i). 
e670: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e690: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
e6a0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
e6b0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
e6c0: 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61  ndex implies tha
e6d0: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71  t the DISTINCT q
e6e0: 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75  ualifier is redu
e6f0: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  ndant. */.      
e700: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
e710: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
e720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
e730: 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69  outine decides i
e740: 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73  f pIdx can be us
e750: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
e760: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
e770: 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e  ause.  If it can
e780: 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  , it returns 1. 
e790: 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20   If pIdx cannot 
e7a0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f  satisfy the.** O
e7b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
e7c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
e7d0: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f  urns 0..**.** pO
e7e0: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
e7f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
e800: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
e810: 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74  ment.  pTab is t
e820: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
e830: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
e840: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  M clause of that
e850: 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61   same SELECT sta
e860: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68  tement and.** th
e870: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75  e table has a cu
e880: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
e890: 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
e8a0: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62  an index on pTab
e8b0: 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
e8c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
e8d0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
e8e0: 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
e8f0: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
e900: 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f  straints.  Any o
e910: 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  f these columns 
e920: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66  may be missing f
e930: 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
e940: 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74  .** clause and t
e950: 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69  he match can sti
e960: 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e  ll be a success.
e970: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73  .**.** All terms
e980: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
e990: 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69   that match agai
e9a0: 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75  nst the index mu
e9b0: 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20  st be either.** 
e9c0: 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54  ASC or DESC.  (T
e9d0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
e9e0: 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74  R BY clause past
e9f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e   the end of a UN
ea00: 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f  IQUE.** index do
ea10: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74   not need to sat
ea20: 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72  isfy this constr
ea30: 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52  aint.)  The *pbR
ea40: 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  ev value is.** s
ea50: 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f  et to 1 if the O
ea60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
ea70: 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69  s all DESC and i
ea80: 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  t is set to 0 if
ea90: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
eaa0: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41   clause is all A
eab0: 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SC..*/.static in
eac0: 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  t isSortingIndex
ead0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
eae0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
eaf0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
eb00: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
eb10: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20 4d   *pMaskSet, /* M
eb20: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c  apping from tabl
eb30: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
eb40: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
eb50: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
eb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
eb70: 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65 73  index we are tes
eb80: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61  ting */.  int ba
eb90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
eba0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
ebb0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
ebc0: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
ebd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ebe0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
ebf0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
ec00: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f  e */.  int nEqCo
ec10: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
ec20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
ec30: 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d  x columns with =
ec40: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  = constraints */
ec50: 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 2c 20  .  int wsFlags, 
ec60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
ec70: 64 65 78 20 75 73 61 67 65 73 20 66 6c 61 67 73  dex usages flags
ec80: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eca0: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
ecb0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
ecc0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ecf0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
ed00: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
ed20: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
ed30: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
ed40: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
ed50: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed70: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
ed80: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
ed90: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
eda0: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
edb0: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
edc0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
edd0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
ede0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
edf0: 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 29   if( !pOrderBy )
ee00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ee10: 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
ee20: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72 65 74  _COLUMN_IN ) ret
ee30: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
ee40: 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
ee50: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 54 65  return 0;..  nTe
ee60: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
ee70: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
ee80: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
ee90: 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d   Argument pIdx m
eea0: 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74  ust either point
eeb0: 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d   to a 'real' nam
eec0: 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  ed index structu
eed0: 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20  re, .  ** or an 
eee0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
eef0: 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
ef00: 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42 74   stack by bestBt
ef10: 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20  reeIndex() to.  
ef20: 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ** represent the
ef30: 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61   rowid index tha
ef40: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76 65  t is part of eve
ef50: 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ry table.  */.  
ef60: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e  assert( pIdx->zN
ef70: 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  ame || (pIdx->nC
ef80: 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
ef90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d  ->aiColumn[0]==-
efa0: 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63  1) );..  /* Matc
efb0: 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  h terms of the O
efc0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
efd0: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  gainst columns o
efe0: 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  f.  ** the index
eff0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
f000: 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68 61   that indices ha
f010: 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ve pIdx->nColumn
f020: 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73   regular columns
f030: 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61   plus.  ** one a
f040: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
f050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f060: 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69  rowid.  The rowi
f070: 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66  d column.  ** of
f080: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c   the index is al
f090: 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  so allowed to ma
f0a0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
f0b0: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
f0c0: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ause..  */.  for
f0d0: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  (i=j=0, pTerm=pO
f0e0: 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65  rderBy->a; j<nTe
f0f0: 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e  rm && i<=pIdx->n
f100: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
f110: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
f120: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
f130: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
f140: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
f150: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
f160: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
f170: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f180: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
f190: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
f1a0: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
f1b0: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
f1c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
f1d0: 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  mn;       /* The
f1e0: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i-th column of 
f1f0: 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66  the index.  -1 f
f200: 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  or rowid */.    
f210: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20  int iSortOrder; 
f220: 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43     /* 1 for DESC
f230: 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74  , 0 for ASC on t
f240: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  he i-th index te
f250: 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  rm */.    const 
f260: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20  char *zColl; /* 
f270: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c  Name of the coll
f280: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
f290: 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  or i-th index te
f2a0: 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72  rm */..    pExpr
f2b0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
f2c0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
f2d0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
f2e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
f2f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  base ){.      /*
f300: 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20   Can not use an 
f310: 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e  index sort on an
f320: 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e  ything that is n
f330: 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ot a column in t
f340: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74  he.      ** left
f350: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74  -most table of t
f360: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
f370: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f380: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
f390: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
f3a0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
f3b0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
f3c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
f3d0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
f3e0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
f3f0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26 20   pIdx->zName && 
f400: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  i<pIdx->nColumn 
f410: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
f420: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
f430: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
f440: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
f450: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
f460: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
f470: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
f480: 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d      iSortOrder =
f490: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
f4a0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  r[i];.      zCol
f4b0: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
f4c0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
f4d0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
f4e0: 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
f4f0: 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
f500: 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a  zColl = pColl->z
f510: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Name;.    }.    
f520: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
f530: 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73  mn!=iColumn || s
f540: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
f550: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
f560: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  l) ){.      /* T
f570: 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44  erm j of the ORD
f580: 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  ER BY clause doe
f590: 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75  s not match colu
f5a0: 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65  mn i of the inde
f5b0: 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  x */.      if( i
f5c0: 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  <nEqCol ){.     
f5d0: 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65     /* If an inde
f5e0: 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  x column that is
f5f0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
f600: 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  == fails to matc
f610: 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  h an.        ** 
f620: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74  ORDER BY term, t
f630: 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74  hat is OK.  Just
f640: 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c   ignore that col
f650: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
f660: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f670: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
f680: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d      }else if( i=
f690: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
f6a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
f6b0: 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74  ex column i is t
f6c0: 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f  he rowid.  All o
f6d0: 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68  ther terms match
f6e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
f6f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
f700: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
f710: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
f720: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
f730: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61  d is not constra
f740: 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20  ined by ==.     
f750: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69     ** then the i
f760: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  ndex cannot sati
f770: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
f780: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
f790: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f7a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
f7b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
f7c0: 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
f7d0: 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75  rder!=0 || iColu
f7e0: 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  mn==-1 );.    as
f7f0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
f800: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
f810: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
f820: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f830: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
f840: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
f850: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
f860: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
f870: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
f880: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
f890: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
f8a0: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
f8b0: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
f8c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
f8d0: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
f8e0: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
f8f0: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
f900: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
f910: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
f920: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
f930: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
f940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f950: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
f960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
f970: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
f980: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
f990: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
f9a0: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
f9b0: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
f9c0: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
f9d0: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
f9e0: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
f9f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
fa00: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
fa10: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
fa20: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
fa30: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
fa40: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
fa50: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
fa60: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
fa70: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
fa80: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
fa90: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
faa0: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
fab0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
fac0: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
fad0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
fae0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
faf0: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
fb00: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
fb10: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
fb20: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
fb30: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
fb40: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
fb50: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
fb60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
fb70: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
fb80: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
fb90: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
fba0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
fbb0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
fbc0: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
fbd0: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
fbe0: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
fbf0: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
fc00: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
fc10: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
fc20: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
fc30: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
fc40: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
fc50: 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 20 26     && (wsFlags &
fc60: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
fc70: 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  LL)==0.      && 
fc80: 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72  !referencesOther
fc90: 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c  Tables(pOrderBy,
fca0: 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61   pMaskSet, j, ba
fcb0: 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  se) ){.    /* Al
fcc0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20  l terms of this 
fcd0: 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65  index match some
fce0: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f   prefix of the O
fcf0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
fd00: 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e     ** and the in
fd10: 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e  dex is UNIQUE an
fd20: 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68  d no terms on th
fd30: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52  e tail of the OR
fd40: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
fd50: 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f  ause reference o
fd60: 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61  ther tables in a
fd70: 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20   join.  If this 
fd80: 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e  is all true then
fd90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65  .    ** the orde
fda0: 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73  r by clause is s
fdb0: 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e 6f 74  uperfluous.  Not
fdc0: 20 74 68 61 74 20 69 66 20 74 68 65 20 6d 61 74   that if the mat
fdd0: 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63 6f 6e  ching.    ** con
fde0: 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e 55 4c  dition is IS NUL
fdf0: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
fe00: 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
fe10: 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20 20 20  rily unique.    
fe20: 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55 4e 49  ** even on a UNI
fe30: 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20 64 69  QUE index, so di
fe40: 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63 61 73  sallow those cas
fe50: 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  es. */.    retur
fe60: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
fe70: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
fe80: 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73  epare a crude es
fe90: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f  timate of the lo
fea0: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
feb0: 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nput value..** T
fec0: 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20  he results need 
fed0: 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54  not be exact.  T
fee0: 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
fef0: 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a   for estimating.
ff00: 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73  ** the total cos
ff10: 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20  t of performing 
ff20: 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20  operations with 
ff30: 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f  O(logN) or O(Nlo
ff40: 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74  gN).** complexit
ff50: 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73  y.  Because N is
ff60: 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69   just a guess, i
ff70: 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72  t is no great tr
ff80: 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e  agedy if.** logN
ff90: 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66   is a little off
ffa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
ffb0: 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65  le estLog(double
ffc0: 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f   N){.  double lo
ffd0: 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65  gN = 1;.  double
ffe0: 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65   x = 10;.  while
fff0: 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67  ( N>x ){.    log
10000 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d  N += 1;.    x *=
10010 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   10;.  }.  retur
10020 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n logN;.}../*.**
10030 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
10040 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
10050 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
10060 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
10070 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
10080 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
10090 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
100a0 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
100b0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
100c0 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
100d0 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
100e0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
100f0 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
10100 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
10110 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10120 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
10130 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
10140 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  ).static void TR
10150 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73  ACE_IDX_INPUTS(s
10160 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10170 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
10180 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
10190 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
101a0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
101b0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
101c0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
101d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
101e0 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20  constraint[%d]: 
101f0 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64  col=%d termid=%d
10200 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25   op=%d usabled=%
10210 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
10220 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
10230 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  raint[i].iColumn
10240 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10250 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d  straint[i].iTerm
10260 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70  Offset,.       p
10270 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
10280 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  .op,.       p->a
10290 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73  Constraint[i].us
102a0 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  able);.  }.  for
102b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65  (i=0; i<p->nOrde
102c0 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  rBy; i++){.    s
102d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
102e0 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d  f("  orderby[%d]
102f0 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64  : col=%d desc=%d
10300 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
10310 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
10320 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  y[i].iColumn,.  
10330 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
10340 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d  [i].desc);.  }.}
10350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
10360 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73  CE_IDX_OUTPUTS(s
10370 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10380 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  o *p){.  int i;.
10390 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68    if( !sqlite3Wh
103a0 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72  ereTrace ) retur
103b0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
103c0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
103d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
103e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
103f0 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
10400 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
10410 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
10420 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
10430 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
10440 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
10450 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10460 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
10470 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10480 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
10490 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
104a0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
104b0 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
104c0 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
104d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
104e0 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
104f0 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
10500 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
10510 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
10520 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
10530 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
10540 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
10550 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
10560 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
10570 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
10580 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
10590 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f  UTS(A).#endif../
105a0 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62  * .** Required b
105b0 65 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78  ecause bestIndex
105c0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  () is called by 
105d0 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
105e0 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  x() .*/.static v
105f0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20  oid bestIndex(. 
10600 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65     Parse*, Where
10610 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20  Clause*, struct 
10620 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a 20  SrcList_item*,. 
10630 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69 74 6d     Bitmask, Bitm
10640 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  ask, ExprList*, 
10650 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a  WhereCost*);../*
10660 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10670 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e   attempts to fin
10680 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74  d an scanning st
10690 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e 20  rategy that can 
106a0 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f  be used .** to o
106b0 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20  ptimize an 'OR' 
106c0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
106d0 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48 45  is part of a WHE
106e0 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a  RE clause. .**.*
106f0 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f  * The table asso
10700 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d  ciated with FROM
10710 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72   clause term pSr
10720 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  c may be either 
10730 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54  a.** regular B-T
10740 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76  ree table or a v
10750 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
10760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
10770 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 0a  tOrClauseIndex(.
10780 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107a0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
107b0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
107c0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
107d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
107e0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
107f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10800 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
10810 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
10820 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
10830 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
10840 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
10850 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
10860 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
10870 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
10880 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69   Bitmask notVali
10890 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
108a0 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  Cursors not avai
108b0 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75  lable for any pu
108c0 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  rpose */.  ExprL
108d0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
108e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
108f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
10900 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
10910 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
10920 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
10930 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23  ery plan */.){.#
10940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10950 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
10960 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  ON.  const int i
10970 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
10980 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
10990 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
109a0 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
109b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d   */.  const Bitm
109c0 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65  ask maskSrc = ge
109d0 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
109e0 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20  Set, iCur);  /* 
109f0 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63  Bitmask for pSrc
10a00 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
10a10 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d  * const pWCEnd =
10a20 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
10a30 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  erm];        /* 
10a40 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
10a50 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
10a60 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
10a70 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
10a80 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
10a90 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  HERE clause */..
10aa0 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75    /* The OR-clau
10ab0 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
10ac0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66  is disallowed if
10ad0 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
10ae0 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45  or.  ** NOT INDE
10af0 58 45 44 20 63 6c 61 75 73 65 73 20 61 72 65 20  XED clauses are 
10b00 75 73 65 64 20 6f 72 20 69 66 20 74 68 65 20 57  used or if the W
10b10 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20 62 69  HERE_AND_ONLY bi
10b20 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69  t is set. */.  i
10b30 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
10b40 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49 6e  xed || pSrc->pIn
10b50 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  dex!=0 ){.    re
10b60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
10b70 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  pWC->wctrlFlags 
10b80 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59  & WHERE_AND_ONLY
10b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10ba0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
10bb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10bc0 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73  e terms for a us
10bd0 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e  able WO_OR term.
10be0 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
10bf0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
10c00 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
10c10 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
10c20 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20  Operator==WO_OR 
10c30 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d  .     && ((pTerm
10c40 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d  ->prereqAll & ~m
10c50 61 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61  askSrc) & notRea
10c60 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  dy)==0.     && (
10c70 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
10c80 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61  ->indexable & ma
10c90 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29  skSrc)!=0 .    )
10ca0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
10cb0 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
10cc0 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
10cd0 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
10ce0 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
10cf0 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
10d00 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
10d10 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
10d20 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
10d30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
10d40 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
10d50 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  R;.      double 
10d60 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  rTotal = 0;.    
10d70 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20    double nRow = 
10d80 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  0;.      Bitmask
10d90 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20   used = 0;..    
10da0 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
10db0 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
10dc0 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
10dd0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68  m++){.        Wh
10de0 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73  ereCost sTermCos
10df0 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  t;.        WHERE
10e00 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74  TRACE(("... Mult
10e10 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69  i-index OR testi
10e20 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f  ng for term %d o
10e30 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20  f %d....\n", .  
10e40 20 20 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d          (pOrTerm
10e50 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70   - pOrWC->a), (p
10e60 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20  Term - pWC->a). 
10e70 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
10e80 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
10e90 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e  eOperator==WO_AN
10ea0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  D ){.          W
10eb0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
10ec0 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
10ed0 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
10ee0 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e 64           bestInd
10ef0 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57  ex(pParse, pAndW
10f00 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
10f10 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20  y, notValid, 0, 
10f20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20  &sTermCost);.   
10f30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10f40 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
10f50 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20  or==iCur ){.    
10f60 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
10f70 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20  e tempWC;.      
10f80 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73      tempWC.pPars
10f90 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
10fa0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
10fb0 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43  C.pMaskSet = pWC
10fc0 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20  ->pMaskSet;.    
10fd0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
10fe0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
10ff0 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
11000 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
11010 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
11020 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
11030 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46 6c 61   tempWC.wctrlFla
11040 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  gs = 0;.        
11050 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
11060 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65   1;.          be
11070 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
11080 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e  &tempWC, pSrc, n
11090 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69  otReady, notVali
110a0 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74  d, 0, &sTermCost
110b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
110c0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
110d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
110e0 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
110f0 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73  = sTermCost.rCos
11100 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20  t;.        nRow 
11110 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 70 6c 61  += sTermCost.pla
11120 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  n.nRow;.        
11130 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73  used |= sTermCos
11140 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20  t.used;.        
11150 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73  if( rTotal>=pCos
11160 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  t->rCost ) break
11170 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11180 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
11190 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
111a0 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
111b0 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
111c0 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
111d0 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
111e0 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
111f0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 21     if( pOrderBy!
11200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48  =0 ){.        WH
11210 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73  ERETRACE(("... s
11220 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73  orting increases
11230 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f   OR cost %.9g to
11240 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20   %.9g\n",.      
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 54                rT
11260 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f  otal, rTotal+nRo
11270 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29  w*estLog(nRow)))
11280 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  ;.        rTotal
11290 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
112a0 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  nRow);.      }..
112b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
112c0 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67  cost of scanning
112d0 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74   using this OR t
112e0 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  erm for optimiza
112f0 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
11300 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
11310 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72  urrent cost stor
11320 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70  ed in pCost, rep
11330 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
11340 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43  s.      ** of pC
11350 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48  ost. */.      WH
11360 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d  ERETRACE(("... m
11370 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f  ulti-index OR co
11380 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39  st=%.9g nrow=%.9
11390 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52  g\n", rTotal, nR
113a0 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ow));.      if( 
113b0 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43  rTotal<pCost->rC
113c0 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ost ){.        p
113d0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54  Cost->rCost = rT
113e0 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  otal;.        pC
113f0 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64  ost->used = used
11400 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
11410 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f  >plan.nRow = nRo
11420 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  w;.        pCost
11430 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
11440 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
11450 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54  pCost->plan.u.pT
11460 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  erm = pTerm;.   
11470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
11480 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11490 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
114a0 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64  TION */.}..#ifnd
114b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
114c0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
114d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
114e0 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
114f0 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20  ause term pTerm 
11500 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65  is of a form whe
11510 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62  re it.** could b
11520 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
11530 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70  ndex to access p
11540 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e  Src, assuming an
11550 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
11560 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a  index existed..*
11570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72  /.static int ter
11580 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a  mCanDriveIndex(.
11590 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
115a0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
115b0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
115c0 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a   term to check *
115d0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
115e0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
115f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61     /* Table we a
11600 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63  re trying to acc
11610 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ess */.  Bitmask
11620 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20   notReady       
11630 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
11640 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s in outer loops
11650 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
11660 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
11670 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
11680 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43  Cursor!=pSrc->iC
11690 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30  ursor ) return 0
116a0 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  ;.  if( pTerm->e
116b0 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20  Operator!=WO_EQ 
116c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
116d0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
116e0 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
116f0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
11700 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70  .  aff = pSrc->p
11710 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  Tab->aCol[pTerm-
11720 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
11730 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21  ffinity;.  if( !
11740 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
11750 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45  nityOk(pTerm->pE
11760 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74 75  xpr, aff) ) retu
11770 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
11780 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
11790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
117a0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
117b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  /*.** If the que
117c0 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63  ry plan for pSrc
117d0 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 70 43   specified in pC
117e0 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61  ost is a full ta
117f0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20  ble scan.** and 
11800 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f  indexing is allo
11810 77 73 20 28 69 66 20 74 68 65 72 65 20 69 73 20  ws (if there is 
11820 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  no NOT INDEXED c
11830 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a  lause) and it.**
11840 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e   possible to con
11850 73 74 72 75 63 74 20 61 20 74 72 61 6e 73 69 65  struct a transie
11860 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f  nt index that wo
11870 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74  uld perform bett
11880 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c  er.** than a ful
11890 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65  l table scan eve
118a0 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20  n when the cost 
118b0 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  of constructing 
118c0 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20  the index.** is 
118d0 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75  taken into accou
118e0 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74  nt, then alter t
118f0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f  he query plan to
11900 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e   use the.** tran
11910 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a  sient index..*/.
11920 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
11930 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a  AutomaticIndex(.
11940 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11960 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
11970 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
11980 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
11990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
119a0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
119b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
119c0 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
119d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
119e0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
119f0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
11a00 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
11a10 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
11a20 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
11a30 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
11a40 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
11a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
11a60 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
11a70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c  an */.){.  doubl
11a80 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20 20  e nTableRow;    
11a90 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69         /* Rows i
11aa0 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c  n the input tabl
11ab0 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f  e */.  double lo
11ac0 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gN;             
11ad0 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65     /* log(nTable
11ae0 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  Row) */.  double
11af0 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20 20   costTempIdx;   
11b00 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65        /* per-que
11b10 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20 74  ry cost of the t
11b20 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
11b30 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
11b40 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
11b50 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
11b60 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
11b70 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
11b80 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20  erm *pWCEnd;    
11b90 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
11ba0 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61  pWC->a[] */.  Ta
11bb0 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
11bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11bd0 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62 65 20  le tht might be 
11be0 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66  indexed */..  if
11bf0 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ( pParse->nQuery
11c00 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31 20  Loop<=(double)1 
11c10 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
11c20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62  is no point in b
11c30 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d  uilding an autom
11c40 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20 61  atic index for a
11c50 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f 0a   single scan */.
11c60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11c70 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
11c80 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
11c90 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20  E_AutoIndex)==0 
11ca0 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  ){.    /* Automa
11cb0 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65 20  tic indices are 
11cc0 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d  disabled at run-
11cd0 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  time */.    retu
11ce0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
11cf0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
11d00 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
11d10 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a 20  ULLSCAN)!=0 ){. 
11d20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79     /* We already
11d30 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20   have some kind 
11d40 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20  of index in use 
11d50 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20  for this query. 
11d60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11d70 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e   }.  if( pSrc->n
11d80 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  otIndexed ){.   
11d90 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45   /* The NOT INDE
11da0 58 45 44 20 63 6c 61 75 73 65 20 61 70 70 65 61  XED clause appea
11db0 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a  rs in the SQL. *
11dc0 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11dd0 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 69 73  }.  if( pSrc->is
11de0 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a 20 20  Correlated ){.  
11df0 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
11e00 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
11e10 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70 6f  sub-query. No po
11e20 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e 67 20  int in indexing 
11e30 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
11e40 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
11e50 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ( pParse->nQuery
11e60 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29  Loop >= (double)
11e70 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  1 );.  pTable = 
11e80 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54  pSrc->pTab;.  nT
11e90 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65  ableRow = pTable
11ea0 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67  ->nRowEst;.  log
11eb0 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c  N = estLog(nTabl
11ec0 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d  eRow);.  costTem
11ed0 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e  pIdx = 2*logN*(n
11ee0 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d  TableRow/pParse-
11ef0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29  >nQueryLoop + 1)
11f00 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70  ;.  if( costTemp
11f10 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  Idx>=pCost->rCos
11f20 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
11f30 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67  cost of creating
11f40 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
11f50 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72  able would be gr
11f60 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  eater than.    *
11f70 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c  * doing the full
11f80 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
11f90 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
11fa0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
11fb0 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d  any equality com
11fc0 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a  parison term */.
11fd0 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
11fe0 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
11ff0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
12000 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
12010 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
12020 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
12030 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
12040 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
12050 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
12060 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65  (("auto-index re
12070 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20  duces cost from 
12080 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c  %.1f to %.1f\n",
12090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
120a0 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
120b0 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29  t, costTempIdx))
120c0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  ;.      pCost->r
120d0 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49  Cost = costTempI
120e0 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  dx;.      pCost-
120f0 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67  >plan.nRow = log
12100 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f  N + 1;.      pCo
12110 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
12120 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   = WHERE_TEMP_IN
12130 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  DEX;.      pCost
12140 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  ->used = pTerm->
12150 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
12160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12170 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
12180 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
12190 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c  icIndex(A,B,C,D,
121a0 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  E)  /* no-op */.
121b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
121c0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
121d0 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64  INDEX */...#ifnd
121e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
121f0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
12200 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12210 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
12220 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
12230 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
12240 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
12250 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
12260 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
12270 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
12280 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
12290 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
122a0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
122b0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
122c0 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
122d0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
122e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
122f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12300 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
12310 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
12320 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
12330 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
12340 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
12350 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
12360 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
12370 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
12380 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
12390 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
123a0 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
123b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
123c0 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
123d0 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
123e0 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
123f0 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
12400 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
12410 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
12420 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12440 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
12450 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
12460 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
12470 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
12480 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
12490 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
124a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
124b0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
124c0 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
124d0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
124e0 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
124f0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
12500 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
12510 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
12520 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
12530 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
12540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
12550 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
12560 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
12570 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
12580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12590 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
125a0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
125b0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
125c0 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
125f0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
12600 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
12610 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12630 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
12640 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79  indexed */.  Key
12650 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20  Info *pKeyinfo; 
12660 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
12670 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
12680 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a  the index */   .
12690 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126b0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65   Top of the inde
126c0 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20  x fill loop */. 
126d0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126f0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
12700 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64   an index record
12710 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e    /* Column coun
12740 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ter */.  int i; 
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12770 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  nter */.  int mx
12780 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  BitCol;         
12790 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
127a0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d   column in pSrc-
127b0 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f  >colUsed */.  Co
127c0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
127e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
127f0 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a  to on a column *
12800 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43  /.  Bitmask idxC
12810 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ols;            
12820 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c  /* Bitmap of col
12830 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e  umns used for in
12840 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
12850 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20  ask extraCols;  
12860 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
12870 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  p of additional 
12880 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a  columns */..  /*
12890 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
128a0 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
128b0 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
128c0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
128d0 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
128e0 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
128f0 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
12900 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
12910 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
12920 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12930 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12940 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
12950 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
12960 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  rse);..  /* Coun
12970 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12980 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
12990 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
129a0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
129b0 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
129c0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
129d0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f  traints */.  nCo
129e0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62  lumn = 0;.  pTab
129f0 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
12a00 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
12a10 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
12a20 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
12a30 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
12a40 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
12a50 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
12a60 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
12a70 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
12a80 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
12a90 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
12aa0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
12ab0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
12ac0 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
12ad0 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
12ae0 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
12af0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
12b00 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
12b10 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
12b20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12b30 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
12b40 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
12b50 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
12b60 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  {.        nColum
12b70 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78  n++;.        idx
12b80 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
12b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12ba0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75  .  assert( nColu
12bb0 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  mn>0 );.  pLevel
12bc0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f  ->plan.nEq = nCo
12bd0 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  lumn;..  /* Coun
12be0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12bf0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12c00 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
12c10 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
12c20 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
12c30 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
12c40 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
12c50 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
12c60 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
12c70 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
12c80 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
12c90 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
12ca0 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
12cb0 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
12cc0 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
12cd0 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
12ce0 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
12cf0 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
12d00 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
12d10 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
12d20 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
12d30 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
12d40 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
12d50 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
12d60 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
12d70 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
12d80 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
12d90 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
12da0 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
12db0 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
12dc0 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b  ols | (((Bitmask
12dd0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a  )1)<<(BMS-1)));.
12de0 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54    mxBitCol = (pT
12df0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d  able->nCol >= BM
12e00 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70  S-1) ? BMS-1 : p
12e10 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74  Table->nCol;.  t
12e20 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
12e30 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
12e40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12e50 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
12e60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
12e70 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
12e80 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
12e90 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
12ea0 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b  )<<i) ) nColumn+
12eb0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
12ec0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28  c->colUsed & (((
12ed0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
12ee0 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  -1)) ){.    nCol
12ef0 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  umn += pTable->n
12f00 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
12f10 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   }.  pLevel->pla
12f20 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
12f30 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57  RE_COLUMN_EQ | W
12f40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
12f50 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  WO_EQ;..  /* Con
12f60 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12f70 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
12f80 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
12f90 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  /.  nByte = size
12fa0 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79  of(Index);.  nBy
12fb0 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
12fc0 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f  zeof(int);     /
12fd0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
12fe0 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
12ff0 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68  Column*sizeof(ch
13000 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ar*);   /* Index
13010 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79  .azColl */.  nBy
13020 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20  te += nColumn;  
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13040 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
13050 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  er */.  pIdx = s
13060 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
13070 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
13080 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64  Byte);.  if( pId
13090 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
130a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
130b0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  pIdx = pIdx;.  p
130c0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
130d0 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a  har**)&pIdx[1];.
130e0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
130f0 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e   = (int*)&pIdx->
13100 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b  azColl[nColumn];
13110 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
13120 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78  der = (u8*)&pIdx
13130 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
13140 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  mn];.  pIdx->zNa
13150 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
13160 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ";.  pIdx->nColu
13170 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = nColumn;.  
13180 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
13190 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
131a0 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
131b0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
131c0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
131d0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
131e0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
131f0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
13200 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
13210 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
13220 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13230 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
13240 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
13250 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
13260 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
13270 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
13280 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  l;.      if( (id
13290 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
132a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
132b0 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
132c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
132d0 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
132e0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
132f0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
13300 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
13310 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
13320 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
13330 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
13340 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
13350 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
13360 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13370 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43  l[n] = ALWAYS(pC
13380 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  oll) ? pColl->zN
13390 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
133a0 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
133b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
133c0 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
133d0 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45  =pLevel->plan.nE
133e0 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
133f0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
13400 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
13410 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
13420 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
13430 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
13440 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
13450 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
13460 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
13470 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
13480 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70  )<<i) ){.      p
13490 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
134a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
134b0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
134c0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
134d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
134e0 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
134f0 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
13500 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
13510 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
13520 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
13530 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
13540 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
13550 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
13560 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
13570 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
13580 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
13590 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
135a0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
135b0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
135c0 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
135d0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
135e0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
135f0 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
13600 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
13610 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
13620 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
13630 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
13640 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
13650 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20  Column+1, 0,.   
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13670 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f   (char*)pKeyinfo
13680 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
13690 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d  DOFF);.  VdbeCom
136a0 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
136b0 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
136c0 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
136d0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
136e0 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
136f0 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
13700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13710 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
13720 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
13730 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
13740 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13750 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
13760 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
13770 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
13780 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13790 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29  r, regRecord, 1)
137a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
137b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
137c0 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
137d0 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
137e0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
137f0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
13800 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
13810 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
13820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13830 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
13840 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
13850 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
13860 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
13870 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
13880 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
13890 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
138a0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
138b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
138c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
138d0 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
138e0 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
138f0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
13900 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
13910 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13920 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
13930 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13940 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
13950 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
13960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13970 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
13980 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
13990 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
139a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
139b0 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
139c0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
139d0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
139e0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
139f0 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
13a00 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
13a10 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
13a20 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
13a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
13a40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
13a50 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
13a60 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
13a70 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
13a80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13a90 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73  e, .  WhereClaus
13aa0 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74  e *pWC,.  struct
13ab0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
13ac0 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
13ad0 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69  *pOrderBy.){.  i
13ae0 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
13af0 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
13b00 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13b10 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
13b20 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
13b30 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
13b40 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
13b50 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
13b60 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
13b70 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
13b80 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13b90 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
13ba0 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
13bb0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
13bc0 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41  nfo;..  WHERETRA
13bd0 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
13be0 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
13bf0 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e  %s...\n", pSrc->
13c00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
13c10 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
13c20 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
13c30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
13c40 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
13c50 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
13c60 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
13c70 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
13c80 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
13c90 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
13ca0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
13cb0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
13cc0 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
13cd0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
13ce0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
13cf0 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
13d00 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
13d10 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
13d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13d30 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
13d40 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
13d50 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13d60 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
13d70 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
13d80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
13d90 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
13da0 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
13db0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
13dc0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
13dd0 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
13de0 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
13df0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
13e00 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
13e10 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
13e20 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
13e30 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
13e40 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
13e50 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
13e60 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
13e70 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
13e80 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13e90 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
13ea0 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
13eb0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
13ec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ed0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13ee0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
13ef0 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
13f00 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
13f10 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
13f20 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
13f30 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
13f40 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
13f50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13f60 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72     if( i==pOrder
13f70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
13f80 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f     nOrderBy = pO
13f90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
13fa0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13fb0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
13fc0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13fd0 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
13fe0 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
13ff0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
14000 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
14010 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
14040 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
14050 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
14060 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
14090 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
140a0 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
140b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
140c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
140d0 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
140e0 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64  ory");.    /* (d
140f0 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
14100 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
14110 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
14120 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
14130 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
14140 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
14150 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
14160 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14170 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
14180 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
14190 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
141a0 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
141b0 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
141c0 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
141d0 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
141e0 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
141f0 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
14200 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
14210 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
14220 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
14230 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
14240 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14250 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
14260 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
14270 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
14280 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
14290 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
142a0 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
142b0 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
142c0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
142d0 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
142e0 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
142f0 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
14300 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
14310 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
14320 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
14330 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
14340 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
14350 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14360 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
14370 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
14380 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
14390 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
143a0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
143b0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
143c0 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
143d0 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
143e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
143f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
14400 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
14410 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
14470 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
14480 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
14490 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
144a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
144b0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
144c0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
144d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
144e0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65  ssert( (pTerm->e
144f0 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d  Operator&(pTerm-
14500 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d  >eOperator-1))==
14510 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
14520 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
14530 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
14540 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14550 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
14560 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
14570 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
14580 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
14590 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
145a0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
145b0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
145c0 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
145d0 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
145e0 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
145f0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
14600 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
14610 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
14620 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   i;.    pIdxCons
14630 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65  [j].op = (u8)pTe
14640 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  rm->eOperator;. 
14650 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
14660 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
14670 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
14680 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
14690 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
146a0 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
146b0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
146c0 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
146d0 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
146e0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
146f0 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
14700 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
14710 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
14720 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14730 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
14740 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
14750 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14760 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
14770 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
14780 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
14790 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
147a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
147b0 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
147c0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
147d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
147e0 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
147f0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
14800 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14810 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
14820 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14830 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
14840 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
14850 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
14860 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
14870 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
14880 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
14890 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
148a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
148b0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
148c0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
148d0 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
148e0 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
148f0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
14900 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
14910 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
14920 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
14930 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
14940 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
14950 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
14960 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
14970 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
14980 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14990 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
149a0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
149b0 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
149c0 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
149d0 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
149e0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
149f0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14a00 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
14a10 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14a20 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
14a30 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
14a40 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
14a50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14a60 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
14a70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
14a80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
14a90 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
14aa0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
14ab0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
14ac0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14ad0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
14ae0 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
14af0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14b00 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
14b10 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
14b20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
14b30 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
14b40 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
14b50 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14b60 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
14b70 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
14b80 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
14b90 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
14ba0 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
14bb0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
14bc0 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
14bd0 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
14be0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14bf0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
14c00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14c10 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
14c20 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
14c30 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
14c40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
14c50 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
14c60 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
14c70 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
14c80 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
14c90 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
14ca0 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
14cb0 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
14cc0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
14cd0 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
14ce0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
14cf0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
14d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14d20 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
14d30 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
14d40 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
14d50 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
14d60 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
14d70 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
14d80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14d90 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
14da0 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
14db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14dc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14dd0 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
14de0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
14df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14e00 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
14e10 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
14e20 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
14e30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
14e40 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
14e50 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
14e60 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
14e70 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
14e80 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
14e90 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
14ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14eb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14ec0 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
14ed0 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
14ee0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
14ef0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
14f00 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
14f10 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
14f20 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  e->nErr;.}.../*.
14f30 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
14f40 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
14f50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14f60 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e  *.** The best in
14f70 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20  dex is computed 
14f80 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
14f90 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  x method of the 
14fa0 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
14fb0 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72   module.  This r
14fc0 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79  outine is really
14fd0 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20   just a wrapper 
14fe0 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20  that sets up.** 
14ff0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
15000 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
15010 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
15020 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
15030 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e  h.** xBestIndex.
15040 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e  .**.** In a join
15050 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
15060 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d  ight be called m
15070 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f  ultiple times fo
15080 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69  r the.** same vi
15090 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
150a0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
150b0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
150c0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
150d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20   initialized on 
150e0 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
150f0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
15100 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  on all subsequen
15110 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73  t.** invocations
15120 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
15130 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15140 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ure is also used
15150 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73   when.** code is
15160 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63   generated to ac
15170 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
15180 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65   table.  The whe
15190 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a  reInfoDelete() .
151a0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73  ** routine takes
151b0 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67   care of freeing
151c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
151d0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
151e0 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79  e after.** every
151f0 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65  body has finishe
15200 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74  d with it..*/.st
15210 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56 69  atic void bestVi
15220 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61  rtualIndex(.  Pa
15230 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15250 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
15260 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
15270 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
15280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15290 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
152a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
152b0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
152c0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
152d0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
152e0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
152f0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
15300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
15310 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74  k of cursors not
15320 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69   available for i
15330 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
15340 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20  k notValid,     
15350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
15360 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64 20 66  sors not valid f
15370 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a  or any purpose *
15380 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
15390 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
153a0 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
153b0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
153c0 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
153d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153e0 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
153f0 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 73  uery plan */.  s
15400 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15410 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20 2f  o **ppIdxInfo  /
15420 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74  * Index informat
15430 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42  ion passed to xB
15440 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  estIndex */.){. 
15450 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
15460 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  Src->pTab;.  sql
15470 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15480 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
15490 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
154a0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
154b0 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
154c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
154d0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
154e0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
154f0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
15500 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
15510 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75 62 6c  OrderBy;.  doubl
15520 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d  e rCost;..  /* M
15530 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67 73  ake sure wsFlags
15540 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
15550 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61 6c  to some sane val
15560 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
15570 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c  f the .  ** mall
15580 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49 6e  oc in allocateIn
15590 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73 20  dexInfo() fails 
155a0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
155b0 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69 6e  n returns leavin
155c0 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20 69  g.  ** wsFlags i
155d0 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
155e0 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63 61  ed state, the ca
155f0 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65 20  ller may behave 
15600 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a 20  unpredictably.. 
15610 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
15620 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
15630 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d  Cost));.  pCost-
15640 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
15650 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
15660 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  LE;..  /* If the
15670 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15680 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61  nfo structure ha
15690 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
156a0 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ously.  ** alloc
156b0 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
156c0 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  ized, then alloc
156d0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
156e0 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ze it now..  */.
156f0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70    pIdxInfo = *pp
15700 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
15710 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
15720 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70    *ppIdxInfo = p
15730 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
15740 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
15750 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
15760 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
15770 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
15790 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
157a0 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69   point, the sqli
157b0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
157c0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49  tructure that pI
157d0 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20  dxInfo points.  
157e0 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20  ** to will have 
157f0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
15800 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20  , either during 
15810 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
15820 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64  cation or.  ** d
15830 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72  uring some prior
15840 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f   invocation.  No
15850 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74  w we just have t
15860 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a  o customize the.
15870 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
15880 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65  pIdxInfo for the
15890 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
158a0 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20  ion and pass it 
158b0 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  to.  ** xBestInd
158c0 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ex..  */..  /* T
158d0 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d  he module name m
158e0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20  ust be defined. 
158f0 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f  Also, by this po
15900 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20  int there must. 
15910 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72   ** be a pointer
15920 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
15930 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f  tab structure. O
15940 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71  therwise.  ** sq
15950 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
15960 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20  mnNames() would 
15970 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74  have picked up t
15980 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a  he error. .  */.
15990 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
159a0 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70  azModuleArg && p
159b0 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
159c0 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [0] );.  assert(
159d0 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
159e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
159f0 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ab) );..  /* Set
15a00 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   the aConstraint
15a10 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73  [].usable fields
15a20 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
15a30 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74  all .  ** output
15a40 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65   variables to ze
15a50 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43  ro..  **.  ** aC
15a60 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
15a70 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 63  le is true for c
15a80 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72 65  onstraints where
15a90 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a   the right-hand.
15aa0 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69    ** side contai
15ab0 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  ns only referenc
15ac0 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20  es to tables to 
15ad0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
15ae0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62  current.  ** tab
15af0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
15b00 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73  rds, if the cons
15b10 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65  traint is of the
15b20 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
15b30 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
15b40 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20  n = expr.  **.  
15b50 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65 76  ** and we are ev
15b60 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c  aluating a join,
15b70 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
15b80 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69  aint on column i
15b90 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c  s .  ** only val
15ba0 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73  id if all tables
15bb0 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65   referenced in e
15bc0 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65  xpr occur to the
15bd0 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68   left.  ** of th
15be0 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
15bf0 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a  ng column..  **.
15c00 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72    ** The aConstr
15c10 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f  aints[] array co
15c20 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
15c30 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  or all constrain
15c40 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63  ts.  ** on the c
15c50 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54  urrent table.  T
15c60 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20  hat way we only 
15c70 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  have to compute 
15c80 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65  it once.  ** eve
15c90 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68  n though we migh
15ca0 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68  t try to pick th
15cb0 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c  e best index mul
15cc0 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a  tiple times..  *
15cd0 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d  * For each attem
15ce0 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e  pt at picking an
15cf0 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65   index, the orde
15d00 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
15d10 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67  he.  ** join mig
15d20 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ht be different 
15d30 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
15d40 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61 62  compute the usab
15d50 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63  le flag.  ** eac
15d60 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  h time..  */.  p
15d70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
15d80 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15d90 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
15da0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
15db0 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d  aint;.  pUsage =
15dc0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
15dd0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66  traintUsage;.  f
15de0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
15df0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
15e00 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
15e10 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43  ){.    j = pIdxC
15e20 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
15e30 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
15e40 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49  WC->a[j];.    pI
15e50 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15e60 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
15e70 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29 20 3f  ight&notReady) ?
15e80 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65   0 : 1;.  }.  me
15e90 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
15ea0 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
15eb0 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
15ec0 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20  straint);.  if( 
15ed0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
15ee0 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
15ef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15f00 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
15f10 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f  ;.  }.  pIdxInfo
15f20 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
15f30 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
15f40 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
15f50 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
15f60 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
15f70 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
15f80 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28  med = 0;.  /* ((
15f90 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73  double)2) In cas
15fa0 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
15fb0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
15fc0 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .. */.  pIdxInfo
15fd0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
15fe0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
15ff0 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a   / ((double)2);.
16000 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
16010 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
16020 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79  .  if( !pOrderBy
16030 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
16040 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->nOrderBy = 0;.
16050 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42    }..  if( vtabB
16060 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
16070 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29   pTab, pIdxInfo)
16080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
16090 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20    }..  pIdxCons 
160a0 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
160b0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
160c0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
160d0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
160e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
160f0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
16100 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16110 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
16120 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  dex>0 ){.      p
16130 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70 57  Cost->used |= pW
16140 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d  C->a[pIdxCons[i]
16150 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72  .iTermOffset].pr
16160 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d  ereqRight;.    }
16170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16180 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
16190 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
161a0 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74  he selected virt
161b0 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a  ual table index.
161c0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61    ** does not sa
161d0 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61  tisfy it, increa
161e0 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  se the cost of t
161f0 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e  he scan accordin
16200 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d  gly. This.  ** m
16210 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65  atches the proce
16220 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69  ssing for non-vi
16230 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20  rtual tables in 
16240 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
16250 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d  ..  */.  rCost =
16260 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
16270 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20  atedCost;.  if( 
16280 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64 78  pOrderBy && pIdx
16290 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
162a0 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  sumed==0 ){.    
162b0 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28  rCost += estLog(
162c0 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20  rCost)*rCost;.  
162d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74  }..  /* The cost
162e0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
162f0 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
16300 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
16310 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61   (the.  ** inita
16320 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73  l value of lowes
16330 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f  tCost in this lo
16340 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68  op. If it is, th
16350 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73  en the.  ** (cos
16360 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
16370 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
16380 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a  ver be true..  *
16390 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f  * .  ** Use "(do
163a0 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20  uble)2" instead 
163b0 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65  of "2.0" in case
163c0 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50   OMIT_FLOATING_P
163d0 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65  OINT .  ** is de
163e0 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  fined..  */.  if
163f0 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ( (SQLITE_BIG_DB
16400 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72  L/((double)2))<r
16410 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43 6f 73  Cost ){.    pCos
16420 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49  t->rCost = (SQLI
16430 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75  TE_BIG_DBL/((dou
16440 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65  ble)2));.  }else
16450 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f  {.    pCost->rCo
16460 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
16470 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
16480 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78 49  pVtabIdx = pIdxI
16490 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nfo;.  if( pIdxI
164a0 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
164b0 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73  umed ){.    pCos
164c0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
164d0 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
164e0 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
164f0 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  lan.nEq = 0;.  p
16500 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
16510 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20  y = nOrderBy;.. 
16520 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
16530 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
16540 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
16550 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  by using multipl
16560 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74  e indexes.  ** t
16570 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52  o optimize an OR
16580 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
16590 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
165a0 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73  use. .  */.  bes
165b0 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
165c0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
165d0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
165e0 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20  alid, pOrderBy, 
165f0 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pCost);.}.#endif
16600 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16610 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
16620 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16630 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
16640 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
16650 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
16660 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
16670 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
16680 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
16690 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
166a0 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
166b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
166c0 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
166d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
166e0 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
166f0 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
16700 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
16710 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
16720 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
16730 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
16740 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
16750 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61 74  int whereKeyStat
16760 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
16770 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
16780 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
16790 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  nection */.  Ind
167a0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
167b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
167c0 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f  x to consider do
167d0 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c  main of */.  sql
167e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
167f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ,        /* Valu
16800 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  e to consider */
16810 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16830 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
16840 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
16850 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
16860 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
16870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16880 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
16890 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74 52 6f  here */.){.  tRo
168a0 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65 78 53  wcnt n;.  IndexS
168b0 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 3b 0a  ample *aSample;.
168c0 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65 3b 0a    int i, eType;.
168d0 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30 3b 0a    int isEq = 0;.
168e0 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75 62 6c    i64 v;.  doubl
168f0 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73 73 65  e r, rS;..  asse
16900 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c  rt( roundUp==0 |
16910 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a  | roundUp==1 );.
16920 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
16930 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 69  nSample>0 );.  i
16940 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72 65 74  f( pVal==0 ) ret
16950 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16960 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 61 69  ;.  n = pIdx->ai
16970 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61 53 61  RowEst[0];.  aSa
16980 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
16990 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20 3d 20  mple;.  eType = 
169a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
169b0 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  pe(pVal);..  if(
169c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
169d0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20  NTEGER ){.    v 
169e0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
169f0 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20  int64(pVal);.   
16a00 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20   r = (i64)v;.   
16a10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16a20 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
16a30 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16a40 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16a50 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
16a60 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
16a70 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
16a80 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
16a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
16aa0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16ab0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
16ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16ad0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d  aSample[i].u.i>=
16ae0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
16af0 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  sEq = aSample[i]
16b00 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20  .u.i==v;.       
16b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16b20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
16b30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16b40 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16b50 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
16b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
16b70 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
16b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
16b90 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  Eq = aSample[i].
16ba0 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20  u.r==r;.        
16bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16bd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79  .  }else if( eTy
16be0 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  pe==SQLITE_FLOAT
16bf0 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69   ){.    r = sqli
16c00 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
16c10 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (pVal);.    for(
16c20 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
16c30 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
16c40 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
16c50 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
16c60 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
16c70 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16c80 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
16c90 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
16ca0 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16cb0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16cc0 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
16cd0 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c       rS = aSampl
16ce0 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20  e[i].u.r;.      
16cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16d00 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  S = aSample[i].u
16d10 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
16d20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20    if( rS>=r ){. 
16d30 20 20 20 20 20 20 20 69 73 45 71 20 3d 20 72 53         isEq = rS
16d40 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ==r;.        bre
16d50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16d60 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54  }.  }else if( eT
16d70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
16d80 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
16d90 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30     if( aSample[0
16da0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
16db0 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b  NULL ) isEq = 1;
16dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
16dd0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
16de0 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
16df0 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
16e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16e10 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16e30 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16e40 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
16e50 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16e60 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
16e70 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
16e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e90 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
16ea0 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a  Sample ){      .
16eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
16ec0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16ed0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16ee0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
16ef0 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
16f00 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16f10 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
16f20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
16f30 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
16f40 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  lob(pVal);.     
16f50 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
16f60 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
16f70 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d    assert( pColl-
16f80 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
16f90 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8 );.      }else
16fa0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
16fb0 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
16fc0 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
16fd0 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61  TF8, 0, *pIdx->a
16fe0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zColl);.        
16ff0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  if( pColl==0 ){.
17000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17020 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
17030 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
17040 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
17060 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
17070 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17080 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
170a0 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
170b0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
170c0 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
170d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
170e0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  z ){.          r
170f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17100 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
17110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 20        assert( z 
17120 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  && pColl && pCol
17130 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20  l->xCmp );.     
17140 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c   }.      n = sql
17150 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 70  ite3ValueBytes(p
17160 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  Val, pColl->enc)
17170 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b  ;.  .      for(;
17180 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
17190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
171a0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
171b0 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d  nt eSampletype =
171c0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
171d0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
171e0 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
171f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17200 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
17210 74 79 70 65 21 3d 65 54 79 70 65 20 29 20 62 72  type!=eType ) br
17220 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
17230 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
17240 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
17250 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
17260 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
17270 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
17280 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
17290 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
172a0 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
172b0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
172c0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
172d0 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
172e0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
172f0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
17300 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
17310 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
17320 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17330 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17340 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17350 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17370 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c         c = pColl
17380 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
17390 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
173a0 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
173b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
173c0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
173d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
173e0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
173f0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   {.          c =
17400 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
17410 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
17420 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
17430 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
17440 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
17450 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29        if( c>=0 )
17460 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17470 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b  c==0 ) isEq = 1;
17480 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
17490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
174a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
174b0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
174c0 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  t, aSample[i] is
174d0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
174e0 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
174f0 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65  r than.  ** or e
17500 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f  qual to pVal.  O
17510 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53  r if i==pIdx->nS
17520 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20  ample, then all 
17530 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73  samples are less
17540 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e  .  ** than pVal.
17550 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d    If aSample[i]=
17560 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71  =pVal, then isEq
17570 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ==1..  */.  if( 
17580 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65  isEq ){.    asse
17590 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
175a0 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74  ple );.    aStat
175b0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
175c0 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b  .nLt;.    aStat[
175d0 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  1] = aSample[i].
175e0 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nEq;.  }else{.  
175f0 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
17600 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  , iUpper, iGap;.
17610 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
17620 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
17630 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  ;.      iUpper =
17640 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b   aSample[0].nLt;
17650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17660 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49    iUpper = i>=pI
17670 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20  dx->nSample ? n 
17680 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74  : aSample[i].nLt
17690 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  ;.      iLower =
176a0 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45   aSample[i-1].nE
176b0 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d  q + aSample[i-1]
176c0 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  .nLt;.    }.    
176d0 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d  aStat[1] = pIdx-
176e0 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20  >avgEq;.    if( 
176f0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
17700 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 30  {.      iGap = 0
17710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17720 20 20 20 69 47 61 70 20 3d 20 69 55 70 70 65 72     iGap = iUpper
17730 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d   - iLower;.    }
17740 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70  .    if( roundUp
17750 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17760 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20   (iGap*2)/3;.   
17770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
17780 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20  ap = iGap/3;.   
17790 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20   }.    aStat[0] 
177a0 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b  = iLower + iGap;
177b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
177c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
177d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
177e0 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT3 */../*.
177f0 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
17800 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17810 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17820 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
17830 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
17840 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
17850 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
17860 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
17870 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
17880 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
17890 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
178a0 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
178b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
178c0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
178d0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
178e0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
178f0 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
17900 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17910 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17930 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
17940 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
17950 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
17960 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
17970 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
17980 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
17990 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
179a0 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
179b0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
179c0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
179d0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
179e0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
179f0 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
17a00 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17a10 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17a20 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
17a30 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
17a40 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
17a50 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
17a60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17a70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17a80 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
17a90 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
17aa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17ab0 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63 20 69  E_STAT3.static i
17ac0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
17ad0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17ae0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
17af0 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
17b00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17b10 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17b20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
17b30 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
17b40 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
17b50 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
17b60 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
17b70 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
17b80 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
17b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17ba0 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
17bb0 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
17bc0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  ;.    *pp = sqli
17bd0 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
17be0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
17bf0 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a  re, iVar, aff);.
17c00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17c10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
17c20 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  rn sqlite3ValueF
17c30 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
17c40 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
17c50 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29  E_UTF8, aff, pp)
17c60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17c70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17c80 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
17c90 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17ca0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17cb0 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
17cc0 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
17cd0 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
17ce0 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
17cf0 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
17d00 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
17d10 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
17d20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
17d30 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
17d40 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
17d50 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
17d60 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
17d70 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
17d80 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
17d90 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
17da0 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
17db0 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
17dc0 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
17dd0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17de0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17df0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
17e20 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
17e30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17e40 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17e60 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
17e70 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
17e80 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
17e90 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
17ea0 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
17eb0 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
17ec0 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
17ed0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
17ee0 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
17ef0 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65  * The nEq parame
17f00 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
17f10 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69  e index of the i
17f20 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  ndex column subj
17f30 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61  ect to the.** ra
17f40 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
17f50 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
17f60 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
17f70 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17f80 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  ints.** optimize
17f90 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
17fa0 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
17fb0 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
17fc0 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a  ing index p is.*
17fd0 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  * on t1(a, b), a
17fe0 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
17ff0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
18000 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
18010 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
18020 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
18030 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
18040 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 65  ld be passed the
18050 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68 65   value 1 (as the
18060 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
18070 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20  d column,.** b, 
18080 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  is the second le
18090 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
180a0 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
180b0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
180c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
180d0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
180e0 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
180f0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
18100 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
18110 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65   0..**.** The re
18120 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
18130 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69 73  an integer divis
18140 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  or to reduce the
18150 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65   estimated.** se
18160 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20 72  arch space.  A r
18170 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
18180 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67   means that rang
18190 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
181a0 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20  e.** no help at 
181b0 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76  all.  A return v
181c0 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
181d0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
181e0 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65  s are.** expecte
181f0 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  d to reduce the 
18200 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
18210 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f  half.  And so fo
18220 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rth....**.** In 
18230 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
18240 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
18250 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
18260 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
18270 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
18280 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
18290 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48   factor of 4.  H
182a0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  ence a single co
182b0 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a  nstraint (x>?).*
182c0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  * results in a r
182d0 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61  eturn of 4 and a
182e0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
182f0 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
18300 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
18310 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f  return of 16..*/
18320 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18330 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
18340 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18350 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18360 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18370 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18380 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18390 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
183a0 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
183b0 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
183c0 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
183d0 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
183e0 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
183f0 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
18400 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
18410 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
18420 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
18430 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
18440 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
18450 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
18460 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
18470 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
18480 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
18490 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
184a0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
184b0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
184c0 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67 65    double *pRange
184d0 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65  Div   /* OUT: Re
184e0 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61 63  duce search spac
184f0 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73 6f  e by this diviso
18500 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
18510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
18520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18530 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28  BLE_STAT3..  if(
18540 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53   nEq==0 && p->nS
18550 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  ample ){.    sql
18560 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e  ite3_value *pRan
18570 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63  geVal;.    tRowc
18580 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20  nt iLower = 0;. 
18590 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
185a0 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
185b0 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  0];.    tRowcnt 
185c0 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66  a[2];.    u8 aff
185d0 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
185e0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
185f0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20  ]].affinity;..  
18600 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
18610 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18620 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
18630 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18640 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18650 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
18660 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
18670 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
18680 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  t( pLower->eOper
18690 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70  ator==WO_GT || p
186a0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
186b0 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==WO_GE );.     
186c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
186d0 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65  OK.       && whe
186e0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
186f0 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c  e, p, pRangeVal,
18700 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f   0, a)==SQLITE_O
18710 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  K.      ){.     
18720 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
18730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
18740 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  ower->eOperator=
18750 3d 57 4f 5f 47 54 20 29 20 69 4c 6f 77 65 72 20  =WO_GT ) iLower 
18760 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
18770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
18780 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
18790 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
187a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
187b0 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
187c0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
187d0 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
187e0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
187f0 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
18800 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18810 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
18820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18830 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18840 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70  r==WO_LT || pUpp
18850 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
18860 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 69 66  O_LE );.      if
18870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
18880 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
18890 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
188a0 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c  p, pRangeVal, 1,
188b0 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
188c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
188d0 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iUpper = a[0];. 
188e0 20 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65         if( pUppe
188f0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
18900 5f 4c 45 20 29 20 69 55 70 70 65 72 20 2b 3d 20  _LE ) iUpper += 
18910 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a[1];.      }.  
18920 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
18930 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b  Free(pRangeVal);
18940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18960 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
18970 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  <=iLower ){.    
18980 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
18990 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f   (double)p->aiRo
189a0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d  wEst[0];.      }
189b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
189c0 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62  RangeDiv = (doub
189d0 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30  le)p->aiRowEst[0
189e0 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70 65  ]/(double)(iUppe
189f0 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
18a00 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
18a10 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73 63  TRACE(("range sc
18a20 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
18a30 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20  %u  div=%g\n",. 
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
18a60 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e  32)iUpper, *pRan
18a70 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72  geDiv));.      r
18a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
18aa0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18ab0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
18ac0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18ad0 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
18ae0 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
18af0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
18b00 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
18b10 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d  ;.  *pRangeDiv =
18b20 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66   (double)1;.  if
18b30 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
18b40 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
18b50 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20  ERM_VNULL)==0 ) 
18b60 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
18b70 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70  ouble)4;.  if( p
18b80 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44  Upper ) *pRangeD
18b90 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
18ba0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18bb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18bc0 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
18bd0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
18be0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
18bf0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
18c00 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
18c10 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
18c20 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
18c30 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
18c40 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
18c50 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
18c60 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
18c70 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
18c80 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18c90 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
18ca0 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
18cb0 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
18cc0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
18cd0 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
18ce0 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
18cf0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
18d00 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
18d10 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
18d20 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
18d30 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
18d40 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18d50 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18d60 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18d80 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18d90 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18da0 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18db0 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18dc0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18dd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18de0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
18df0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
18e00 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
18e10 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
18e20 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
18e30 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18e40 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18e50 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18e60 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18e70 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18e80 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18e90 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18ea0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18eb0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18ed0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
18ee0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18ef0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18f00 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18f10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18f30 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
18f40 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
18f50 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
18f60 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  m */.  Expr *pEx
18f70 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
18f80 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
18f90 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
18fa0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
18fb0 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
18fc0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18fd0 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
18fe0 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
18ff0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
19000 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20  alue *pRhs = 0; 
19010 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67   /* VALUE on rig
19020 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
19030 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20 61 66  pTerm */.  u8 af
19040 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
19050 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
19060 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
19070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19080 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
19090 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
190a0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  e */.  tRowcnt a
190b0 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
190c0 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20 2a   /* Statistics *
190d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
190e0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
190f0 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
19100 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20 3d 20  le>0 );.  aff = 
19110 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
19120 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e  p->aiColumn[0]].
19130 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
19140 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20  pExpr ){.    rc 
19150 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
19160 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
19170 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20  ff, &pRhs);.    
19180 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
19190 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
191a0 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b  cancel;.  }else{
191b0 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69  .    pRhs = sqli
191c0 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72  te3ValueNew(pPar
191d0 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69  se->db);.  }.  i
191e0 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74  f( pRhs==0 ) ret
191f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
19200 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72  UND;.  rc = wher
19210 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
19220 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 61 29  , p, pRhs, 0, a)
19230 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57 48 45  TE_OK ){.    WHE
19250 52 45 54 52 41 43 45 28 28 22 65 71 75 61 6c 69  RETRACE(("equali
19260 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ty scan regions:
19270 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31   %d\n", (int)a[1
19280 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ]));.    *pnRow 
19290 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72  = a[1];.  }.wher
192a0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
192b0 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  ncel:.  sqlite3V
192c0 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a  alueFree(pRhs);.
192d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
192e0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
192f0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
19300 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TAT3) */..#ifdef
19310 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
19320 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT3./*.** Estim
19330 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
19340 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
19350 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
19360 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
19370 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
19380 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
19390 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
193a0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
193b0 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
193c0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
193d0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
193e0 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
193f0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
19400 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
19410 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
19420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19430 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
19440 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
19450 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
19460 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
19470 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
19480 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
19490 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
194a0 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
194b0 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
194c0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
194d0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
194e0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
194f0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
19500 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
19510 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
19520 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
19530 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
19540 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
19550 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
19560 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
19570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19580 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
19590 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
195a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
195b0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
195c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
195d0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
195e0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
195f0 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
19600 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
19610 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  m */.  ExprList 
19620 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
19630 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
19640 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
19650 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
19660 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  " */.  double *p
19670 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
19680 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
19690 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
196a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
196b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
196c0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
196d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
196e0 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 45  e */.  double nE
196f0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
19700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19710 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
19720 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f 75 62  e term */.  doub
19730 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28 64 6f  le nRowEst = (do
19740 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77 20 65  uble)0; /* New e
19750 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
19760 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
19770 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19790 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
197a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
197b0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
197c0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
197d0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
197e0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
197f0 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69      nEst = p->ai
19800 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72  RowEst[0];.    r
19810 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
19820 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 2c  anEst(pParse, p,
19830 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19840 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20  pr, &nEst);.    
19850 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b  nRowEst += nEst;
19860 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
19870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19880 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
19890 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
198a0 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
198b0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
198c0 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
198d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
198e0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
198f0 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52 6f 77   est=%g\n", nRow
19900 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Est));.  }.  ret
19910 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19920 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
19930 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
19940 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   */.../*.** Find
19950 20 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20   the best query 
19960 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
19970 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ng a particular 
19980 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68  table.  Write th
19990 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
199a0 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
199b0 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
199c0 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
199d0 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c  lied as the.** l
199e0 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ast parameter..*
199f0 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
19a00 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20  cost plan wins. 
19a10 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20   The cost is an 
19a20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
19a30 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55  amount of.** CPU
19a40 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65   and disk I/O ne
19a50 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  eded to process 
19a60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
19a70 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  sult..** Factors
19a80 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
19a90 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
19aa0 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
19ab0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
19ac0 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
19ad0 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
19ae0 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
19af0 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
19b00 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
19b10 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
19b20 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
19b30 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
19b40 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
19b50 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
19b60 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
19b70 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
19b80 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
19b90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
19ba0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
19bb0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 28  EXED BY clause (
19bc0 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74  pSrc->pIndex) at
19bd0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
19be0 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51  ble in.** the SQ
19bf0 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  L statement, the
19c00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
19c10 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70  only considers p
19c20 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a  lans using the .
19c30 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ** named index. 
19c40 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20  If no such plan 
19c50 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  is found, then t
19c60 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74  he returned cost
19c70 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49   is.** SQLITE_BI
19c80 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e  G_DBL. If a plan
19c90 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75   is found that u
19ca0 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ses the named in
19cb0 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68  dex, .** then th
19cc0 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c  e cost is calcul
19cd0 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61  ated in the usua
19ce0 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l way..**.** If 
19cf0 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  a NOT INDEXED cl
19d00 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49  ause (pSrc->notI
19d10 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20 61  ndexed!=0) was a
19d20 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
19d30 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
19d40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19d50 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
19d60 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
19d70 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
19d80 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
19d90 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
19da0 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
19db0 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20   built-in rowid 
19dc0 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69  primary key.** i
19dd0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
19de0 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
19df0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
19e00 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
19e10 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
19e20 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
19e30 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
19e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19e50 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
19e60 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
19e70 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
19e80 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
19e90 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
19ea0 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
19eb0 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
19ec0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
19ed0 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
19ee0 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ble for indexing
19ef0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
19f00 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20  tValid,         
19f10 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
19f20 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
19f30 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20  ny purpose */.  
19f40 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
19f50 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
19f60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19f70 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
19f80 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20   *pDistinct,    
19f90 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63      /* The selec
19fa0 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20  t-list if query 
19fb0 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  is DISTINCT */. 
19fc0 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
19fd0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
19fe0 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
19ff0 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69  y plan */.){.  i
1a000 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
1a010 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
1a020 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
1a030 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
1a040 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
1a050 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
1a060 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
1a070 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
1a080 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ing */.  Index *
1a090 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1a0a0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
1a0b0 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20  pProbe, or zero 
1a0c0 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f  for IPK index */
1a0d0 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73  .  int eqTermMas
1a0e0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1a0f0 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f  * Current mask o
1a100 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
1a110 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1a120 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73  int idxEqTermMas
1a130 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  k;          /* I
1a140 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c  ndex mask of val
1a150 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  id equality oper
1a160 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78  ators */.  Index
1a170 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
1a180 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
1a190 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
1a1a0 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
1a1b0 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61  y */.  tRowcnt a
1a1c0 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20  iRowEstPk[2];   
1a1d0 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45     /* The aiRowE
1a1e0 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
1a1f0 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
1a200 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
1a210 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
1a220 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
1a230 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
1a240 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1a250 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20  wsFlagMask;     
1a260 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
1a270 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f 73  ed flags in pCos
1a280 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a  t->plan.wsFlag *
1a290 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
1a2a0 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20 61  ze the cost to a
1a2b0 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c 75   worst-case valu
1a2c0 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43  e */.  memset(pC
1a2d0 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
1a2e0 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74  pCost));.  pCost
1a2f0 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  ->rCost = SQLITE
1a300 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20  _BIG_DBL;..  /* 
1a310 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  If the pSrc tabl
1a320 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
1a330 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
1a340 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20  OIN then we may 
1a350 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20  not.  ** use an 
1a360 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79  index to satisfy
1a370 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61   IS NULL constra
1a380 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62  ints on that tab
1a390 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  le.  This is.  *
1a3a0 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  * because column
1a3b0 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  s might end up b
1a3c0 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65  eing NULL if the
1a3d0 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
1a3e0 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63  match -.  ** a c
1a3f0 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63  ircumstance whic
1a400 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  h the index cann
1a410 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f  ot help us disco
1a420 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31  ver.  Ticket #21
1a430 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  77..  */.  if( p
1a440 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
1a450 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69  JT_LEFT ){.    i
1a460 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57  dxEqTermMask = W
1a470 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65  O_EQ|WO_IN;.  }e
1a480 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65  lse{.    idxEqTe
1a490 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
1a4a0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
1a4b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d    }..  if( pSrc-
1a4c0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
1a4d0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
1a4e0 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
1a4f0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
1a500 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
1a510 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20    pIdx = pProbe 
1a520 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
1a530 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
1a540 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
1a550 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
1a560 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
1a570 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
1a580 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mask;.  }else{. 
1a590 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1a5a0 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
1a5b0 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
1a5c0 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
1a5d0 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
1a5e0 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
1a5f0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
1a600 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1a610 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
1a620 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
1a630 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
1a640 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
1a650 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
1a660 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
1a670 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
1a680 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
1a690 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
1a6c0 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
1a6d0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
1a6e0 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
1a6f0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
1a700 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
1a710 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
1a720 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
1a730 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
1a740 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
1a750 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72  .    sPk.onError
1a760 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20   = OE_Replace;. 
1a770 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20     sPk.pTable = 
1a780 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
1a790 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
1a7a0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  pSrc->pTab->nRow
1a7b0 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
1a7c0 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20  tPk[1] = 1;.    
1a7d0 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
1a7e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1a7f0 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
1a800 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dexed==0 ){.    
1a810 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e    /* The real in
1a820 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62  dices of the tab
1a830 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73  le are only cons
1a840 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20  idered if the.  
1a850 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58      ** NOT INDEX
1a860 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  ED qualifier is 
1a870 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
1a880 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1a890 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
1a8a0 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
1a8b0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
1a8c0 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  k;.    wsFlagMas
1a8d0 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57  k = ~(.        W
1a8e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1a8f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
1a900 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1a910 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1a920 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65  NGE.    );.    e
1a930 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
1a940 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64  Q|WO_IN;.    pId
1a950 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1a960 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
1a970 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ndices looking f
1a980 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20  or the best one 
1a990 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  to use.  */.  fo
1a9a0 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78  r(; pProbe; pIdx
1a9b0 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e  =pProbe=pProbe->
1a9c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73  pNext){.    cons
1a9d0 74 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f 6e 73  t tRowcnt * cons
1a9e0 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72  t aiRowEst = pPr
1a9f0 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  obe->aiRowEst;. 
1aa00 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20     double cost; 
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa20 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
1aa30 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f  pProbe */.    do
1aa40 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20  uble nRow;      
1aa50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
1aa60 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
1aa70 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74 20   rows in result 
1aa80 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  set */.    doubl
1aa90 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f 75 62  e log10N = (doub
1aaa0 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65 2d 31  le)1;  /* base-1
1aab0 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 6e  0 logarithm of n
1aac0 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a 2f  Row (inexact) */
1aad0 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20  .    int rev;   
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e   /* True to scan
1ab00 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1ab10 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46  r */.    int wsF
1ab20 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69  lags = 0;.    Bi
1ab30 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a  tmask used = 0;.
1ab40 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1ab50 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
1ab60 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61  are populated ba
1ab70 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65  sed on the prope
1ab80 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  rties of.    ** 
1ab90 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c  index being eval
1aba0 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65 20  uated. They are 
1abb0 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74  then used to det
1abc0 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63  ermine the expec
1abd0 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20  ted.    ** cost 
1abe0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  and number of ro
1abf0 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  ws returned..   
1ac00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a   **.    **  nEq:
1ac10 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62   .    **    Numb
1ac20 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74  er of equality t
1ac30 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65  erms that can be
1ac40 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
1ac50 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ng the index..  
1ac60 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65 72    **    In other
1ac70 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d 62   words, the numb
1ac80 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66 69  er of initial fi
1ac90 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64 65  elds in the inde
1aca0 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20  x that.    **   
1acb0 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d 20   are used in == 
1acc0 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55 4c  or IN or NOT NUL
1acd0 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  L constraints of
1ace0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1acf0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1ad00 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20 20    nInMul:  .    
1ad10 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d 75  **    The "in-mu
1ad20 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73 20  ltiplier". This 
1ad30 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1ad40 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b 20  f how many seek 
1ad50 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20 20  operations .    
1ad60 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73  **    SQLite mus
1ad70 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68 65  t perform on the
1ad80 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74 69   index in questi
1ad90 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  on. For example,
1ada0 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
1adb0 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20     WHERE clause 
1adc0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1add0 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 49  *      WHERE a I
1ade0 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44 20  N (1, 2, 3) AND 
1adf0 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a 20  b IN (4, 5, 6). 
1ae00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ae10 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66  SQLite must perf
1ae20 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f 6e  orm 9 lookups on
1ae30 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
1ae40 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20 69   b), so nInMul i
1ae50 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65 74  s .    **    set
1ae60 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68 65   to 9. Given the
1ae70 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e 64   same schema and
1ae80 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1ae90 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20 0a  ollowing WHERE .
1aea0 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73 65      **    clause
1aeb0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1aec0 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d 20        WHERE a = 
1aed0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57   1.    **      W
1aee0 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20 20  HERE a >= 2.    
1aef0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e  **.    **    nIn
1af00 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31 2e  Mul is set to 1.
1af10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1af20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74    If there exist
1af30 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20 6f  s a WHERE term o
1af40 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49 4e  f the form "x IN
1af50 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c 20   (SELECT ...)", 
1af60 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  then .    **    
1af70 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69  the sub-select i
1af80 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65 74  s assumed to ret
1af90 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72 20  urn 25 rows for 
1afa0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1afb0 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65 72  .    **    deter
1afc0 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a 20  mining nInMul.. 
1afd0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 49     **.    **  bI
1afe0 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20 20  nEst:  .    **  
1aff0 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66    Set to true if
1b000 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c 65   there was at le
1b010 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28 53  ast one "x IN (S
1b020 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72 6d  ELECT ...)" term
1b030 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20 20   used .    **   
1b040 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20   in determining 
1b050 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49 6e  the value of nIn
1b060 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  Mul.  Note that 
1b070 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 20  the RHS of the. 
1b080 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65 72     **    IN oper
1b090 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20 53  ator must be a S
1b0a0 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61 6c  ELECT, not a val
1b0b0 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68 69  ue list, for thi
1b0c0 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  s variable.    *
1b0d0 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75 65 2e  *    to be true.
1b0e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1b0f0 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20 2a 2a  rangeDiv:.    **
1b100 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65 20      An estimate 
1b110 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62 79 20  of a divisor by 
1b120 77 68 69 63 68 20 74 6f 20 72 65 64 75 63 65 20  which to reduce 
1b130 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1b140 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 74   due.    **    t
1b150 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1b160 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20 74 68  straints.  In th
1b170 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
1b180 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c 59 5a  ite_stat3 ANALYZ
1b190 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61 74 61  E.    **    data
1b1a0 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75  , a single inequ
1b1b0 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
1b1c0 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 74  e search space t
1b1d0 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20 20 20  o 1/4rd its.    
1b1e0 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 73  **    original s
1b1f0 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d 3d 34  ize (rangeDiv==4
1b200 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61 6c 69  ).  Two inequali
1b210 74 69 65 73 20 72 65 64 75 63 65 20 74 68 65 20  ties reduce the 
1b220 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20 20  search.    **   
1b230 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36 74 68   space to 1/16th
1b240 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   of its original
1b250 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1b260 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  =16)..    **.   
1b270 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20   **  bSort:   . 
1b280 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
1b290 2e 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  . True if there 
1b2a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1b2b0 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20  lause that will 
1b2c0 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20  require an .    
1b2d0 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73  **    external s
1b2e0 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69  ort (i.e. scanni
1b2f0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  ng the index bei
1b300 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c  ng evaluated wil
1b310 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20  l not .    **   
1b320 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72   correctly order
1b330 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a   records)..    *
1b340 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75  *.    **  bLooku
1b350 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f  p: .    **    Bo
1b360 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 61  olean. True if a
1b370 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20 69 73   table lookup is
1b380 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
1b390 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20  ch index entry. 
1b3a0 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74 65 64     **    visited
1b3b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1b3c0 73 2c 20 74 72 75 65 20 69 66 20 74 68 69 73 20  s, true if this 
1b3d0 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e  is not a coverin
1b3e0 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  g index..    ** 
1b3f0 20 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79     This is alway
1b400 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  s false for the 
1b410 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1b420 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  y index of a tab
1b430 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f  le..    **    Fo
1b440 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c  r other indexes,
1b450 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65   it is true unle
1b460 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d  ss all the colum
1b470 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  ns of the table.
1b480 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64 20 62      **    used b
1b490 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
1b4a0 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65  tement are prese
1b4b0 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  nt in the index 
1b4c0 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a 2a 20  (such an.    ** 
1b4d0 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65     index is some
1b4e0 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20  times described 
1b4f0 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1b500 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20  dex)..    **    
1b510 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76  For example, giv
1b520 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  en the index on 
1b530 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f  (a, b), the seco
1b540 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd of the follow
1b550 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  ing .    **    t
1b560 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69  wo queries requi
1b570 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65  res table b-tree
1b580 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72 64 65   lookups in orde
1b590 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 76 61  r to find the va
1b5a0 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20 6f 66  lue.    **    of
1b5b0 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74 20 74   column c, but t
1b5c0 68 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f  he first does no
1b5d0 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  t because column
1b5e0 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 20 20  s a and b are.  
1b5f0 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61 76 61    **    both ava
1b600 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 69 6e  ilable in the in
1b610 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
1b620 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
1b630 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52  ELECT a, b    FR
1b640 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
1b650 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   1;.    **      
1b660 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
1b670 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
1b680 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
1b690 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  */.    int nEq; 
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b6c0 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
1b6d0 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
1b6e0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73  */.    int bInEs
1b6f0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1b700 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b710 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1b720 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  )" seen */.    i
1b730 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b 20 20  nt nInMul = 1;  
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b750 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1b760 63 74 20 65 71 75 61 6c 69 74 69 65 73 20 74 6f  ct equalities to
1b770 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 64   lookup */.    d
1b780 6f 75 62 6c 65 20 72 61 6e 67 65 44 69 76 20 3d  ouble rangeDiv =
1b790 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20   (double)1;  /* 
1b7a0 45 73 74 69 6d 61 74 65 64 20 72 65 64 75 63 74  Estimated reduct
1b7b0 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20 73 70  ion in search sp
1b7c0 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ace */.    int n
1b7d0 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Bound = 0;      
1b7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b7f0 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  er of range cons
1b800 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a 2f 0a  traints seen */.
1b810 20 20 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20      int bSort = 
1b820 21 21 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20  !!pOrderBy;     
1b830 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78 74    /* True if ext
1b840 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71 75 69  ernal sort requi
1b850 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  red */.    int b
1b860 44 69 73 74 20 3d 20 21 21 70 44 69 73 74 69 6e  Dist = !!pDistin
1b870 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ct;      /* True
1b880 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74   if index cannot
1b890 20 68 65 6c 70 20 77 69 74 68 20 44 49 53 54 49   help with DISTI
1b8a0 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  NCT */.    int b
1b8b0 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20 20 20  Lookup = 0;     
1b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b8d0 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65 72 69   if not a coveri
1b8e0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1b8f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1b900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b910 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
1b920 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1b930 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  se */.#ifdef SQL
1b940 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
1b950 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1b960 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30 3b 20  pFirstTerm = 0; 
1b970 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d     /* First term
1b980 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 69 6e   matching the in
1b990 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  dex */.#endif.. 
1b9a0 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20     /* Determine 
1b9b0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6e 45  the values of nE
1b9c0 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a  q and nInMul */.
1b9d0 20 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b 20 6e      for(nEq=0; n
1b9e0 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
1b9f0 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20 20 20  mn; nEq++){.    
1ba00 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
1ba10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
1ba20 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
1ba30 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1ba40 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
1ba50 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78  eqTermMask, pIdx
1ba60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
1ba70 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rm==0 ) break;. 
1ba80 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1ba90 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  (WHERE_COLUMN_EQ
1baa0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  |WHERE_ROWID_EQ)
1bab0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bac0 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d 70 57  ( pTerm->pWC!=pW
1bad0 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  C );.      if( p
1bae0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1baf0 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1bb00 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1bb10 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1bb20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1bb30 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
1bb40 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  N;.        if( E
1bb50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1bb60 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1bb70 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
1bb80 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
1bb90 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65  T ...)":  Assume
1bba0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
1bbb0 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
1bbc0 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1bbd0 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20  *= 25;.         
1bbe0 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20   bInEst = 1;.   
1bbf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
1bc00 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
1bc10 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
1bc20 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
1bc30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22  {.          /* "
1bc40 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
1bc50 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20  ue, ...)" */.   
1bc60 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d         nInMul *=
1bc70 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1bc80 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1bc90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1bca0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1bcb0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1bcc0 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
1bcd0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
1bce0 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  N_NULL;.      }.
1bcf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1bd00 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20  ABLE_STAT3.     
1bd10 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70   if( nEq==0 && p
1bd20 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20 29  Probe->aSample )
1bd30 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54   pFirstTerm = pT
1bd40 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  erm;.#endif.    
1bd50 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d    used |= pTerm-
1bd60 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
1bd70 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 49 66 20    }. .    /* If 
1bd80 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
1bd90 63 6f 6e 73 69 64 65 72 65 64 20 69 73 20 55 4e  considered is UN
1bda0 49 51 55 45 2c 20 61 6e 64 20 74 68 65 72 65 20  IQUE, and there 
1bdb0 69 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 0a  is an equality .
1bdc0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1bdd0 74 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  t for all column
1bde0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  s in the index, 
1bdf0 74 68 65 6e 20 74 68 69 73 20 73 65 61 72 63 68  then this search
1be00 20 77 69 6c 6c 20 66 69 6e 64 0a 20 20 20 20 2a   will find.    *
1be10 2a 20 61 74 20 6d 6f 73 74 20 61 20 73 69 6e 67  * at most a sing
1be20 6c 65 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20  le row. In this 
1be30 63 61 73 65 20 73 65 74 20 74 68 65 20 57 48 45  case set the WHE
1be40 52 45 5f 55 4e 49 51 55 45 20 66 6c 61 67 20 74  RE_UNIQUE flag t
1be50 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 61  o .    ** indica
1be60 74 65 20 74 68 69 73 20 74 6f 20 74 68 65 20 63  te this to the c
1be70 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  aller..    **.  
1be80 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
1be90 69 66 20 74 68 65 20 73 65 61 72 63 68 20 6d 61  if the search ma
1bea0 79 20 66 69 6e 64 20 6d 6f 72 65 20 74 68 61 6e  y find more than
1beb0 20 6f 6e 65 20 72 6f 77 2c 20 74 65 73 74 20 74   one row, test t
1bec0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
1bed0 74 68 65 72 65 20 69 73 20 61 20 72 61 6e 67 65  there is a range
1bee0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 69   constraint on i
1bef0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 28 6e  ndexed column (n
1bf00 45 71 2b 31 29 20 74 68 61 74 20 63 61 6e 20 62  Eq+1) that can b
1bf10 65 20 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69  e .    ** optimi
1bf20 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  zed using the in
1bf30 64 65 78 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  dex. .    */.   
1bf40 20 69 66 28 20 6e 45 71 3d 3d 70 50 72 6f 62 65   if( nEq==pProbe
1bf50 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 72  ->nColumn && pPr
1bf60 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
1bf70 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74  _None ){.      t
1bf80 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1bf90 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1bfa0 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
1bfb0 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
1bfc0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1bfd0 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  L );.      if( (
1bfe0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1bff0 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1c000 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d  _COLUMN_NULL))==
1c010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1c020 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
1c030 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IQUE;.      }.  
1c040 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
1c050 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  be->bUnordered==
1c060 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  0 ){.      int j
1c070 20 3d 20 28 6e 45 71 3d 3d 70 50 72 6f 62 65 2d   = (nEq==pProbe-
1c080 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20  >nColumn ? -1 : 
1c090 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
1c0a0 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 20 20 69 66  [nEq]);.      if
1c0b0 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
1c0c0 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
1c0d0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
1c0e0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1c0f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ) ){.        Whe
1c100 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66  reTerm *pTop = f
1c110 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1c120 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
1c130 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64  WO_LT|WO_LE, pId
1c140 78 29 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  x);.        Wher
1c150 65 54 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69  eTerm *pBtm = fi
1c160 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1c170 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
1c180 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1c190 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1c1a0 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
1c1b0 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71  rse, pProbe, nEq
1c1c0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 72  , pBtm, pTop, &r
1c1d0 61 6e 67 65 44 69 76 29 3b 0a 20 20 20 20 20 20  angeDiv);.      
1c1e0 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20    if( pTop ){.  
1c1f0 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d          nBound =
1c200 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73   1;.          ws
1c210 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
1c220 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
1c230 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70      used |= pTop
1c240 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1c250 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1c260 65 28 20 70 54 6f 70 2d 3e 70 57 43 21 3d 70 57  e( pTop->pWC!=pW
1c270 43 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  C );.        }. 
1c280 20 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20         if( pBtm 
1c290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f  ){.          nBo
1c2a0 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  und++;.         
1c2b0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1c2c0 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
1c2d0 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70         used |= p
1c2e0 42 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  Btm->prereqRight
1c2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
1c300 63 61 73 65 28 20 70 42 74 6d 2d 3e 70 57 43 21  case( pBtm->pWC!
1c310 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20 20  =pWC );.        
1c320 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  }.        wsFlag
1c330 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55  s |= (WHERE_COLU
1c340 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52  MN_RANGE|WHERE_R
1c350 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
1c360 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c370 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1c380 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1c390 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  e and the index 
1c3a0 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
1c3b0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74   will.    ** nat
1c3c0 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73  urally scan rows
1c3d0 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64   in the required
1c3e0 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20   order, set the 
1c3f0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61 67  appropriate flag
1c400 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c  s.    ** in wsFl
1c410 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ags. Otherwise, 
1c420 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1c430 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1c440 75 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ut the index.   
1c450 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f   ** will scan ro
1c460 77 73 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ws in a differen
1c470 74 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  t order, set the
1c480 20 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65 2e   bSort variable.
1c490 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 53    */.    if( isS
1c4a0 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 20  ortingIndex(.   
1c4b0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
1c4c0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 50  WC->pMaskSet, pP
1c4d0 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 4f 72 64  robe, iCur, pOrd
1c4e0 65 72 42 79 2c 20 6e 45 71 2c 20 77 73 46 6c 61  erBy, nEq, wsFla
1c4f0 67 73 2c 20 26 72 65 76 29 0a 20 20 20 20 29 7b  gs, &rev).    ){
1c500 0a 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30  .      bSort = 0
1c510 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  ;.      wsFlags 
1c520 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  |= WHERE_ROWID_R
1c530 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
1c540 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52  N_RANGE|WHERE_OR
1c550 44 45 52 42 59 3b 0a 20 20 20 20 20 20 77 73 46  DERBY;.      wsF
1c560 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57  lags |= (rev ? W
1c570 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30  HERE_REVERSE : 0
1c580 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1c590 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 44   If there is a D
1c5a0 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
1c5b0 72 20 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78  r and this index
1c5c0 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20   will scan rows 
1c5d0 69 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  in.    ** order 
1c5e0 6f 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  of the DISTINCT 
1c5f0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65  expressions, cle
1c600 61 72 20 62 44 69 73 74 20 61 6e 64 20 73 65 74  ar bDist and set
1c610 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1c620 0a 20 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e  .    ** flags in
1c630 20 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20 20 20   wsFlags. */.   
1c640 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 49   if( isDistinctI
1c650 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1c660 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20  , pProbe, iCur, 
1c670 70 44 69 73 74 69 6e 63 74 2c 20 6e 45 71 29 0a  pDistinct, nEq).
1c680 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
1c690 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1c6a0 49 4e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  IN)==0.    ){.  
1c6b0 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20      bDist = 0;. 
1c6c0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c6d0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
1c6e0 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  E|WHERE_COLUMN_R
1c6f0 41 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49  ANGE|WHERE_DISTI
1c700 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  NCT;.    }..    
1c710 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20  /* If currently 
1c720 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20  calculating the 
1c730 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e  cost of using an
1c740 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20   index (not the 
1c750 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  IPK.    ** index
1c760 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ), determine if 
1c770 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c  all required col
1c780 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20  umn data may be 
1c790 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
1c7a0 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74   .    ** using t
1c7b0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69  he main table (i
1c7c0 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78  .e. if the index
1c7d0 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20   is a covering. 
1c7e0 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20     ** index for 
1c7f0 74 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20  this query). If 
1c800 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57  it is, set the W
1c810 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c  HERE_IDX_ONLY fl
1c820 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46  ag in.    ** wsF
1c830 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  lags. Otherwise,
1c840 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70   set the bLookup
1c850 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75   variable to tru
1c860 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  e.  */.    if( p
1c870 49 64 78 20 26 26 20 77 73 46 6c 61 67 73 20 29  Idx && wsFlags )
1c880 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
1c890 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
1c8a0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  d;.      int j;.
1c8b0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1c8c0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
1c8d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
1c8e0 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
1c8f0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
1c900 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a   if( x<BMS-1 ){.
1c910 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e            m &= ~
1c920 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78  (((Bitmask)1)<<x
1c930 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c940 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
1c950 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ==0 ){.        w
1c960 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1c970 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
1c980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
1c990 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20  Lookup = 1;.    
1c9a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1c9b0 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74  *.    ** Estimat
1c9c0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1c9d0 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20  rows of output. 
1c9e0 20 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53   For an "x IN (S
1c9f0 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a  ELECT...)".    *
1ca00 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f  * constraint, do
1ca10 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74   not let the est
1ca20 69 6d 61 74 65 20 65 78 63 65 65 64 20 68 61 6c  imate exceed hal
1ca30 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
1ca40 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
1ca50 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62      nRow = (doub
1ca60 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71  le)(aiRowEst[nEq
1ca70 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20  ] * nInMul);.   
1ca80 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e   if( bInEst && n
1ca90 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30  Row*2>aiRowEst[0
1caa0 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ] ){.      nRow 
1cab0 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b  = aiRowEst[0]/2;
1cac0 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20  .      nInMul = 
1cad0 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52  (int)(nRow / aiR
1cae0 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20  owEst[nEq]);.   
1caf0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1cb00 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1cb10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
1cb20 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
1cb30 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f  e form x=VALUE o
1cb40 72 20 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e  r x IN (E1,E2,..
1cb50 2e 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65  .).    ** and we
1cb60 20 64 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68   do not think th
1cb70 61 74 20 76 61 6c 75 65 73 20 6f 66 20 78 20 61  at values of x a
1cb80 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20 69 66  re unique and if
1cb90 20 68 69 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a   histogram.    *
1cba0 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  * data is availa
1cbb0 62 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78  ble for column x
1cbc0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
1cbd0 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
1cbe0 2a 2a 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  ** to get a bett
1cbf0 65 72 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74  er estimate on t
1cc00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1cc10 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a  s based on.    *
1cc20 2a 20 56 41 4c 55 45 20 61 6e 64 20 68 6f 77 20  * VALUE and how 
1cc30 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75  common that valu
1cc40 65 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74  e is according t
1cc50 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e  o the histogram.
1cc60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cc70 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20 26  nRow>(double)1 &
1cc80 26 20 6e 45 71 3d 3d 31 20 26 26 20 70 46 69 72  & nEq==1 && pFir
1cc90 73 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52  stTerm!=0 && aiR
1cca0 6f 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20  owEst[1]>1 ){.  
1ccb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69      assert( (pFi
1ccc0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1ccd0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1cce0 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30  SNULL|WO_IN))!=0
1ccf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
1cd00 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1cd10 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1cd20 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ISNULL) ){.     
1cd30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69     testcase( pFi
1cd40 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1cd50 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
1cd60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1cd70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72  FirstTerm->eOper
1cd80 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
1cd90 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1cda0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
1cdb0 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69  rse, pProbe, pFi
1cdc0 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  rstTerm->pExpr->
1cdd0 70 52 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a  pRight, &nRow);.
1cde0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cdf0 62 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bInEst==0 ){.   
1ce00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69       assert( pFi
1ce10 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1ce20 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  or==WO_IN );.   
1ce30 20 20 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e       whereInScan
1ce40 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1ce50 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1ce60 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1ce70 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  &nRow);.      }.
1ce80 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1ce90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1cea0 41 54 33 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  AT3 */..    /* A
1ceb0 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72  djust the number
1cec0 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
1ced0 61 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  and downward to 
1cee0 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
1cef0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
1cf00 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
1cf10 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1cf20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 52  */.    nRow = nR
1cf30 6f 77 2f 72 61 6e 67 65 44 69 76 3b 0a 20 20 20  ow/rangeDiv;.   
1cf40 20 69 66 28 20 6e 52 6f 77 3c 31 20 29 20 6e 52   if( nRow<1 ) nR
1cf50 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ow = 1;..    /* 
1cf60 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20  Experiments run 
1cf70 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64  on real SQLite d
1cf80 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68  atabases show th
1cf90 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64  at the time need
1cfa0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ed.    ** to do 
1cfb0 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
1cfc0 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20  to locate a row 
1cfd0 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  in a table or in
1cfe0 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20  dex is roughly. 
1cff0 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74     ** log10(N) t
1d000 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f  imes the time to
1d010 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72   move from one r
1d020 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ow to the next r
1d030 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  ow within.    **
1d040 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1d050 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74  x.  The actual t
1d060 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77  imes can vary, w
1d070 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a  ith the size of.
1d080 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62      ** records b
1d090 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e  eing an importan
1d0a0 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20  t factor.  Both 
1d0b0 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68  moves and search
1d0c0 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c  es are.    ** sl
1d0d0 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72  ower with larger
1d0e0 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d   records, presum
1d0f0 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77  ably because few
1d100 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20  er records fit. 
1d110 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67     ** on one pag
1d120 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65  e and hence more
1d130 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62   pages have to b
1d140 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a  e fetched..    *
1d150 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41  *.    ** The ANA
1d160 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  LYZE command and
1d170 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
1d180 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
1d190 74 33 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20  t3 tables do.   
1d1a0 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20   ** not give us 
1d1b0 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61  data on the rela
1d1c0 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61  tive sizes of ta
1d1d0 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ble and index re
1d1e0 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f  cords..    ** So
1d1f0 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   this computatio
1d200 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20  n assumes table 
1d210 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75  records are abou
1d220 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20  t twice as big. 
1d230 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72     ** as index r
1d240 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20  ecords.    */.  
1d250 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
1d260 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
1d270 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
1d280 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
1d290 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
1d2a0 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66  n is a number of
1d2b0 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e 73   move operations
1d2c0 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a 20   equal.      ** 
1d2d0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1d2e0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1d2f0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
1d300 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e 20     ** We add an 
1d310 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70 65  additional 4x pe
1d320 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74 61  nalty to full ta
1d330 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69 73  ble scans.  This
1d340 20 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a 2a   causes.      **
1d350 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74 69   the cost functi
1d360 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68 65  on to err on the
1d370 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69 6e   side of choosin
1d380 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72 0a  g an index over.
1d390 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69 6e        ** choosin
1d3a0 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20 20  g a full scan.  
1d3b0 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63 61  This 4x full-sca
1d3c0 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e 20  n penalty is an 
1d3d0 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20 2a  arguable.      *
1d3e0 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20 6f  * decision and o
1d3f0 6e 65 20 77 68 69 63 68 20 77 65 20 65 78 70 65  ne which we expe
1d400 63 74 20 74 6f 20 72 65 76 69 73 69 74 20 69 6e  ct to revisit in
1d410 20 74 68 65 20 66 75 74 75 72 65 2e 20 20 42 75   the future.  Bu
1d420 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73 65  t.      ** it se
1d430 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69 6e  ems to be workin
1d440 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61 74  g well enough at
1d450 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20   the moment..   
1d460 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73 74     */.      cost
1d470 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34   = aiRowEst[0]*4
1d480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d490 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c     log10N = estL
1d4a0 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
1d4b0 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  .      cost = nR
1d4c0 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ow;.      if( pI
1d4d0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  dx ){.        if
1d4e0 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20  ( bLookup ){.   
1d4f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e         /* For an
1d500 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f   index lookup fo
1d510 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c  llowed by a tabl
1d520 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  e lookup:.      
1d530 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c      **    nInMul
1d540 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20   index searches 
1d550 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72  to find the star
1d560 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20  t of each index 
1d570 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  range.          
1d580 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1d590 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64   through the ind
1d5a0 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ex.          ** 
1d5b0 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65   + nRow table se
1d5c0 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70  arches to lookup
1d5d0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
1d5e0 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64   using the rowid
1d5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1d600 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20          cost += 
1d610 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77 29 2a  (nInMul + nRow)*
1d620 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
1d630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d640 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72 69   /* For a coveri
1d650 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20 20  ng index:.      
1d660 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d 75      **     nInMu
1d670 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73  l index searches
1d680 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69   to find the ini
1d690 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
1d6a0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52 6f        **   + nRo
1d6b0 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20  w steps through 
1d6c0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
1d6d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d6e0 20 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a   cost += nInMul*
1d6f0 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
1d700 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1d710 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20         /* For a 
1d720 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1d730 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  y lookup:.      
1d740 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20    **    nInMult 
1d750 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1d760 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69  o find the initi
1d770 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  al entry for eac
1d780 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  h range.        
1d790 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1d7a0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62   through the tab
1d7b0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  le.        */.  
1d7c0 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49        cost += nI
1d7d0 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
1d7e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d7f0 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73  /* Add in the es
1d800 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1d810 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75  sorting the resu
1d820 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65  lt.  Actual expe
1d830 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  rimental.    ** 
1d840 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20  measurements of 
1d850 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61  sorting performa
1d860 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68  nce in SQLite sh
1d870 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  ow that sorting 
1d880 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73  time.    ** adds
1d890 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f   C*N*log10(N) to
1d8a0 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65   the cost, where
1d8b0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1d8c0 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a   of rows to be .
1d8d0 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e      ** sorted an
1d8e0 64 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20  d C is a factor 
1d8f0 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64  between 1.95 and
1d900 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73   4.3.  We will s
1d910 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  plit the.    ** 
1d920 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73  difference and s
1d930 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a  elect C of 3.0..
1d940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
1d950 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  Sort ){.      co
1d960 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  st += nRow*estLo
1d970 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d  g(nRow)*3;.    }
1d980 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20 29  .    if( bDist )
1d990 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
1d9a0 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
1d9b0 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  )*3;.    }..    
1d9c0 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73  /**** Cost of us
1d9d0 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68  ing this index h
1d9e0 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70  as now been comp
1d9f0 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20  uted ****/..    
1da00 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1da10 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
1da20 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74  raints on this t
1da30 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  able that cannot
1da40 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20  .    ** be used 
1da50 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
1da60 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63   index, but whic
1da70 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68  h might lower th
1da80 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  e number.    ** 
1da90 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
1daa0 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20  adjust the nRow 
1dab0 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c  value accordingl
1dac0 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20  y.  This only . 
1dad0 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66     ** matters if
1dae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
1daf0 65 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20  ex is the least 
1db00 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f  costly, so do no
1db10 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  t bother.    ** 
1db20 77 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69  with this step i
1db30 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f  f we already kno
1db40 77 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c  w this index wil
1db50 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e  l not be chosen.
1db60 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65  .    ** Also, ne
1db70 76 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f  ver reduce the o
1db80 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20  utput row count 
1db90 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68  below 2 using th
1dba0 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a  is step..    **.
1dbb0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69      ** It is cri
1dbc0 74 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e  tical that the n
1dbd0 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20  otValid mask be 
1dbe0 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1dbf0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  d of.    ** the 
1dc00 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20  notReady mask.  
1dc10 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  When computing a
1dc20 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65  n "optimal" inde
1dc30 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a  x, the notReady.
1dc40 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c      ** mask will
1dc50 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62   only have one b
1dc60 69 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74  it set - the bit
1dc70 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1dc80 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
1dc90 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1dca0 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  , on the other h
1dcb0 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20  and, always has 
1dcc0 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72  all bits set for
1dcd0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
1dce0 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f  hat are not in o
1dcf0 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20  uter loops.  If 
1dd00 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64  notReady is used
1dd10 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20   here instead.  
1dd20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64    ** of notValid
1dd30 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c  , then a optimal
1dd40 20 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65   index that depe
1dd50 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69  nds on inner joi
1dd60 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20  ns loops.    ** 
1dd70 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65  might be selecte
1dd80 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  d even when ther
1dd90 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69  e exists an opti
1dda0 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  mal index that h
1ddb0 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63  as.    ** no suc
1ddc0 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20  h dependency..  
1ddd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f    */.    if( nRo
1dde0 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70 43 6f  w>2 && cost<=pCo
1ddf0 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
1de00 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1de30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
1de40 69 70 45 71 20 3d 20 6e 45 71 3b 20 20 20 20 20  ipEq = nEq;     
1de50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de60 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  of == constraint
1de70 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20  s to skip */.   
1de80 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67     int nSkipRang
1de90 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20  e = nBound;     
1dea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63  /* Number of < c
1deb0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
1dec0 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d  ip */.      Bitm
1ded0 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20  ask thisTab;    
1dee0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
1def0 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a  ap for pSrc */..
1df00 20 20 20 20 20 20 74 68 69 73 54 61 62 20 3d 20        thisTab = 
1df10 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
1df20 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1df30 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
1df40 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
1df50 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b 3b  rm; nRow>2 && k;
1df60 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
1df70 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1df80 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1df90 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74  M_VIRTUAL ) cont
1dfa0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1dfb0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1dfc0 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29 21  All & notValid)!
1dfd0 3d 74 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69  =thisTab ) conti
1dfe0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1dff0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e000 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e  r & (WO_EQ|WO_IN
1e010 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  |WO_ISNULL) ){. 
1e020 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
1e030 69 70 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ipEq ){.        
1e040 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
1e050 65 20 66 69 72 73 74 20 6e 45 71 20 65 71 75 61  e first nEq equa
1e060 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e  lity matches sin
1e070 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ce the index.   
1e080 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
1e090 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65  already accounte
1e0a0 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20  d for these */. 
1e0b0 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70             nSkip
1e0c0 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  Eq--;.          
1e0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e0e0 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63     /* Assume eac
1e0f0 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75  h additional equ
1e100 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75  ality match redu
1e110 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
1e120 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
1e130 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
1e140 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20  or of 10 */.    
1e150 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20          nRow /= 
1e160 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
1e170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1e180 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1e190 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
1e1a0 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29  E|WO_GT|WO_GE) )
1e1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1e1c0 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20  nSkipRange ){.  
1e1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
1e1e0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ore the first nS
1e1f0 6b 69 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63  kipRange range c
1e200 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65  onstraints since
1e210 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1e220 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
1e230 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20  ready accounted 
1e240 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20  for these */.   
1e250 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61           nSkipRa
1e260 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  nge--;.         
1e270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e280 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61      /* Assume ea
1e290 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61  ch additional ra
1e2a0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  nge constraint r
1e2b0 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c  educes the resul
1e2c0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
1e2d0 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66   set size by a f
1e2e0 61 63 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64  actor of 3.  Ind
1e2f0 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  exed range const
1e300 72 61 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20  raints reduce.  
1e310 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1e320 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
1e330 20 61 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72   a larger factor
1e340 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e  : 4.  We make in
1e350 64 65 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20  dexed range.    
1e360 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20          ** more 
1e370 73 65 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74  selective intent
1e380 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20  ionally because 
1e390 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 69 76  of the subjectiv
1e3a0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
1e3b0 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68  * observation th
1e3c0 61 74 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65  at indexed range
1e3d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61   constraints rea
1e3e0 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20  lly are more.   
1e3f0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65           ** sele
1e400 63 74 69 76 65 20 69 6e 20 70 72 61 63 74 69 63  ctive in practic
1e410 65 2c 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a  e, on average. *
1e420 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1e430 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  ow /= 3;.       
1e440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e450 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f  se if( pTerm->eO
1e460 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50  perator!=WO_NOOP
1e470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1e480 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
1e490 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65  ssion lowers the
1e4a0 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
1e4b0 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20  t by half */.   
1e4c0 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 32         nRow /= 2
1e4d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e4e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 52    }.      if( nR
1e4f0 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32 3b  ow<2 ) nRow = 2;
1e500 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45  .    }...    WHE
1e510 52 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20  RETRACE((.      
1e520 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25 64 20  "%s(%s): nEq=%d 
1e530 6e 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65 44  nInMul=%d rangeD
1e540 69 76 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62  iv=%d bSort=%d b
1e550 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67  Lookup=%d wsFlag
1e560 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20 20 20  s=0x%x\n".      
1e570 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61  "         notRea
1e580 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e  dy=0x%llx log10N
1e590 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20  =%.1f nRow=%.1f 
1e5a0 63 6f 73 74 3d 25 2e 31 66 20 75 73 65 64 3d 30  cost=%.1f used=0
1e5b0 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  x%llx\n",.      
1e5c0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
1e5d0 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
1e5e0 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
1e5f0 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
1e600 4d 75 6c 2c 20 28 69 6e 74 29 72 61 6e 67 65 44  Mul, (int)rangeD
1e610 69 76 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b  iv, bSort, bLook
1e620 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20 20  up, wsFlags,.   
1e630 20 20 20 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67     notReady, log
1e640 31 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 2c  10N, nRow, cost,
1e650 20 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a 20   used.    ));.. 
1e660 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
1e670 64 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20  dex is the best 
1e680 77 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20  we have seen so 
1e690 66 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  far, then record
1e6a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64   this.    ** ind
1e6b0 65 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20  ex and its cost 
1e6c0 69 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74 72  in the pCost str
1e6d0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
1e6e0 20 20 20 69 66 28 20 28 21 70 49 64 78 20 7c 7c     if( (!pIdx ||
1e6f0 20 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20 26   wsFlags).     &
1e700 26 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72  & (cost<pCost->r
1e710 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70  Cost || (cost<=p
1e720 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20 6e  Cost->rCost && n
1e730 52 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  Row<pCost->plan.
1e740 6e 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20  nRow)).    ){.  
1e750 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
1e760 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
1e770 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65  Cost->used = use
1e780 64 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  d;.      pCost->
1e790 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77  plan.nRow = nRow
1e7a0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
1e7b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28 77  lan.wsFlags = (w
1e7c0 73 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61 73  sFlags&wsFlagMas
1e7d0 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  k);.      pCost-
1e7e0 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b  >plan.nEq = nEq;
1e7f0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
1e800 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78  an.u.pIdx = pIdx
1e810 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e820 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  If there was an 
1e830 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1e840 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61  e, then only tha
1e850 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20  t one index is. 
1e860 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1e870 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72  . */.    if( pSr
1e880 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61  c->pIndex ) brea
1e890 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74  k;..    /* Reset
1e8a0 20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e   masks for the n
1e8b0 65 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ext index in the
1e8c0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46   loop */.    wsF
1e8d0 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52  lagMask = ~(WHER
1e8e0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
1e8f0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
1e900 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
1e910 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20  idxEqTermMask;. 
1e920 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1e930 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
1e940 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
1e950 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72  SQLITE_ReverseOr
1e960 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  der flag.  ** is
1e970 20 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72   set, then rever
1e980 73 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61  se the order tha
1e990 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  t the index will
1e9a0 20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a   be scanned.  **
1e9b0 20 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65   in. This is use
1e9c0 64 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f  d for applicatio
1e9d0 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65  n testing, to he
1e9e0 6c 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20  lp find cases.  
1e9f0 2a 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61  ** where applica
1ea00 74 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64  tion behaviour d
1ea10 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75  epends on the (u
1ea20 6e 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20  ndefined) order 
1ea30 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65  that.  ** SQLite
1ea40 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
1ea50 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   in the absence 
1ea60 6f 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  of an ORDER BY c
1ea70 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
1ea80 20 21 70 4f 72 64 65 72 42 79 20 26 26 20 70 50   !pOrderBy && pP
1ea90 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1eaa0 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65  & SQLITE_Reverse
1eab0 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43 6f  Order ){.    pCo
1eac0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1ead0 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
1eae0 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  E;.  }..  assert
1eaf0 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70  ( pOrderBy || (p
1eb00 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1eb10 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1eb20 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
1eb30 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e  ( pCost->plan.u.
1eb40 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73  pIdx==0 || (pCos
1eb50 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  t->plan.wsFlags&
1eb60 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d  WHERE_ROWID_EQ)=
1eb70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1eb80 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pSrc->pIndex==0 
1eb90 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74  .       || pCost
1eba0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30  ->plan.u.pIdx==0
1ebb0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73   .       || pCos
1ebc0 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
1ebd0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20  pSrc->pIndex .  
1ebe0 29 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  );..  WHERETRACE
1ebf0 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73  (("best index is
1ec00 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28  : %s\n", .    ((
1ec10 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1ec20 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
1ec30 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22  FULLSCAN)==0 ? "
1ec40 6e 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20 20  none" : .       
1ec50 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
1ec60 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c  pIdx ? pCost->pl
1ec70 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
1ec80 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a   : "ipk").  ));.
1ec90 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73    .  bestOrClaus
1eca0 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
1ecb0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
1ecc0 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f  dy, notValid, pO
1ecd0 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a  rderBy, pCost);.
1ece0 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49    bestAutomaticI
1ecf0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1ed00 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
1ed10 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73  , pCost);.  pCos
1ed20 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1ed30 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d  |= eqTermMask;.}
1ed40 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
1ed50 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
1ed60 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20  accessing table 
1ed70 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74  pSrc->pTab. Writ
1ed80 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
1ed90 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
1eda0 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
1edb0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
1edc0 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20  supplied .** as 
1edd0 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74  the last paramet
1ede0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1edf0 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20  n may calculate 
1ee00 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62  the cost of.** b
1ee10 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72  oth real and vir
1ee20 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73  tual table scans
1ee30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ee40 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61   bestIndex(.  Pa
1ee50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ee60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ee70 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1ee80 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1ee90 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
1eea0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1eeb0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1eec0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1eed0 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
1eee0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
1eef0 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
1ef00 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
1ef10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ef20 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74  k of cursors not
1ef30 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69   available for i
1ef40 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
1ef50 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20  mask notValid,  
1ef60 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1ef70 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
1ef80 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
1ef90 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1efa0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
1efb0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1efc0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  BY clause */.  W
1efd0 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
1efe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1eff0 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
1f000 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  plan */.){.#ifnd
1f010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1f020 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
1f030 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63  ( IsVirtual(pSrc
1f040 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  ->pTab) ){.    s
1f050 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1f060 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65  o *p = 0;.    be
1f070 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
1f080 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1f090 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
1f0a0 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20  alid, pOrderBy, 
1f0b0 70 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20 69  pCost,&p);.    i
1f0c0 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  f( p->needToFree
1f0d0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
1f0e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1f0f0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20  idxStr);.    }. 
1f100 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f110 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b  (pParse->db, p);
1f120 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
1f130 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65    {.    bestBtre
1f140 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
1f150 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
1f160 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f  dy, notValid, pO
1f170 72 64 65 72 42 79 2c 20 30 2c 20 70 43 6f 73 74  rderBy, 0, pCost
1f180 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f190 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
1f1a0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1f1b0 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
1f1c0 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
1f1d0 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
1f1e0 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
1f1f0 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
1f200 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
1f210 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
1f220 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
1f230 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
1f240 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1f250 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
1f260 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1f270 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
1f280 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
1f290 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1f2a0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
1f2b0 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
1f2c0 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
1f2d0 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1f2e0 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1f2f0 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
1f300 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
1f310 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
1f320 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
1f330 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
1f340 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
1f350 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
1f360 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
1f370 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
1f380 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
1f390 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
1f3a0 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
1f3b0 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
1f3c0 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
1f3d0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
1f3e0 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
1f3f0 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
1f400 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
1f410 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
1f420 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35  F: R-24597-58655
1f430 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f   No tests are do
1f440 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ne for terms tha
1f450 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74  t are.** complet
1f460 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79  ely satisfied by
1f470 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   indices..**.** 
1f480 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
1f490 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
1f4a0 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
1f4b0 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
1f4c0 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
1f4d0 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
1f4e0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1f4f0 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
1f500 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1f510 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
1f520 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
1f530 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
1f540 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
1f550 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
1f560 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
1f570 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
1f580 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
1f590 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
1f5a0 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
1f5b0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1f5c0 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
1f5d0 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
1f5e0 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
1f5f0 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
1f600 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
1f610 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
1f620 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
1f630 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
1f640 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
1f650 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
1f660 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
1f670 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
1f680 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
1f690 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
1f6a0 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
1f6b0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1f6c0 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
1f6d0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
1f6e0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
1f6f0 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
1f700 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
1f710 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
1f720 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
1f730 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
1f740 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
1f750 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
1f760 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
1f770 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
1f780 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
1f790 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
1f7a0 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
1f7b0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
1f7c0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
1f7d0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
1f7e0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1f7f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1f800 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
1f810 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
1f820 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
1f830 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
1f840 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
1f850 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1f860 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
1f870 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ** As an optimiz
1f880 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46  ation, SQLITE_AF
1f890 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28  F_NONE entries (
1f8a0 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73  which are no-ops
1f8b0 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69  ) at the.** begi
1f8c0 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66  nning and end of
1f8d0 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65   zAff are ignore
1f8e0 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69  d.  If all entri
1f8f0 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a  es in zAff are.*
1f900 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1f910 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20  E, then no code 
1f920 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  gets generated..
1f930 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f940 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e  ne makes its own
1f950 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f   copy of zAff so
1f960 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1f970 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d   is free.** to m
1f980 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72  odify zAff after
1f990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1f9a0 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
1f9b0 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
1f9c0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
1f9d0 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
1f9e0 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
1f9f0 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
1fa00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1fa10 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b    if( zAff==0 ){
1fa20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fa30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1fa40 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
1fa50 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
1fa60 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
1fa70 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64   Adjust base and
1fa80 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20   n to skip over 
1fa90 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1faa0 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62  entries at the b
1fab0 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e  eginning.  ** an
1fac0 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66  d end of the aff
1fad0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20  inity string..  
1fae0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  */.  while( n>0 
1faf0 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49  && zAff[0]==SQLI
1fb00 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1fb10 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65     n--;.    base
1fb20 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a  ++;.    zAff++;.
1fb30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31    }.  while( n>1
1fb40 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53   && zAff[n-1]==S
1fb50 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
1fb60 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a  {.    n--;.  }..
1fb70 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50    /* Code the OP
1fb80 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
1fb90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
1fba0 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f  thing left to do
1fbb0 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29  . */.  if( n>0 )
1fbc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1fbd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
1fbe0 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
1fbf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1fc00 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
1fc10 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73   zAff, n);.    s
1fc20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1fc30 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
1fc40 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  arse, base, n);.
1fc50 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
1fc60 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1fc70 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
1fc80 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
1fc90 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
1fca0 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
1fcb0 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
1fcc0 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
1fcd0 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
1fce0 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
1fcf0 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
1fd00 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
1fd10 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
1fd20 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20  aint is left in 
1fd30 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a  register iReg..*
1fd40 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74  *.** For a const
1fd50 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  raint of the for
1fd60 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78  m X=expr, the ex
1fd70 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
1fd80 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a  uated and its.**
1fd90 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20   result is left 
1fda0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46  on the stack.  F
1fdb0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  or constraints o
1fdc0 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20  f the form X IN 
1fdd0 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f  (...).** this ro
1fde0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
1fdf0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69  loop that will i
1fe00 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20  terate over all 
1fe10 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a  values of X..*/.
1fe20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45  static int codeE
1fe30 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
1fe40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1fe50 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1fe60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1fe70 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
1fe80 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
1fe90 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1fea0 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
1feb0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1fec0 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20  pLevel, /* When 
1fed0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
1fee0 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
1fef0 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
1ff00 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20  int iTarget     
1ff10 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74      /* Attempt t
1ff20 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20  o leave results 
1ff30 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1ff40 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
1ff50 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
1ff60 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
1ff70 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1ff80 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20  nt iReg;        
1ff90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1ffa0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
1ffb0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65  sults */..  asse
1ffc0 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b  rt( iTarget>0 );
1ffd0 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  .  if( pX->op==T
1ffe0 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67  K_EQ ){.    iReg
1fff0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20000 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
20010 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pX->pRight, iTa
20020 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rget);.  }else i
20030 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  f( pX->op==TK_IS
20040 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67  NULL ){.    iReg
20050 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
20060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20070 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
20080 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20   iReg);.#ifndef 
20090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
200a0 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
200b0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20    int eType;.   
200c0 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73   int iTab;.    s
200d0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
200e0 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  n;..    assert( 
200f0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
20100 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
20110 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
20120 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
20130 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
20140 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70  0);.    iTab = p
20150 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73  X->iTable;.    s
20160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20170 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
20180 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  Tab, 0);.    ass
20190 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ert( pLevel->pla
201a0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
201b0 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20  E_IN_ABLE );.   
201c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69   if( pLevel->u.i
201d0 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.nIn==0 ){.    
201e0 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78    pLevel->addrNx
201f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
20200 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20210 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75   }.    pLevel->u
20220 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70  .in.nIn++;.    p
20230 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
20240 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  oop =.       sql
20250 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
20260 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
20270 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
20280 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
202b0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
202c0 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  0])*pLevel->u.in
202d0 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d  .nIn);.    pIn =
202e0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
202f0 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
20300 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
20310 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  += pLevel->u.in.
20320 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  nIn - 1;.      p
20330 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b  In->iCur = iTab;
20340 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
20350 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
20360 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d   ){.        pIn-
20370 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
20380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20390 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
203a0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
203b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
203c0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
203d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
203e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
203f0 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20  Tab, 0, iReg);. 
20400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20410 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20420 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65  , OP_IsNull, iRe
20430 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
20440 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69       pLevel->u.i
20450 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  n.nIn = 0;.    }
20460 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
20470 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
20480 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75  , pTerm);.  retu
20490 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
204a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
204b0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
204c0 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e  te all == and IN
204d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
204e0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a   an.** index..**
204f0 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
20500 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
20510 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
20520 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
20530 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
20540 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
20550 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
20560 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
20570 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
20580 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
20590 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
205a0 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
205b0 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
205c0 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
205d0 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
205e0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
205f0 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
20600 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
20610 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
20620 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
20630 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
20640 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
20650 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
20660 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
20670 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
20680 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
20690 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e  stored.** in con
206a0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
206b0 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  rs and the index
206c0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
206d0 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
206e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ed..**.** In the
206f0 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
20700 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
20710 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
20720 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
20730 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
20740 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
20750 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
20760 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
20770 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
20780 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
20790 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
207a0 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
207b0 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d   cell and.** com
207c0 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74  pute the affinit
207d0 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
207e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
207f0 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
20800 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
20810 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72  y cell and retur
20820 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ns.** the index 
20830 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
20840 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68  ell. The code th
20850 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
20860 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
20870 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  e that memory ce
20880 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ll to store the 
20890 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
208a0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
208b0 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
208c0 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
208d0 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
208e0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
208f0 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
20900 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
20910 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
20920 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a  ernal.** use..**
20930 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
20940 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20  ning, *pzAff is 
20950 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
20960 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
20970 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66  ing a.** copy of
20980 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
20990 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74  nity string of t
209a0 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74  he index allocat
209b0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
209c0 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45  te3DbMalloc(). E
209d0 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69  xcept, entries i
209e0 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  n the copy of th
209f0 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  e string associa
20a00 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61  ted.** with equa
20a10 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
20a20 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61   that use NONE a
20a30 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20  ffinity are set 
20a40 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  to.** SQLITE_AFF
20a50 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74  _NONE. This is t
20a60 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20  o deal with SQL 
20a70 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
20a80 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  owing:.**.**   C
20a90 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
20aa0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
20ab0 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45  Y, b);.**   SELE
20ac0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41  CT ... FROM t1 A
20ad0 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  S t2, t1 WHERE t
20ae0 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a  1.a = t2.b;.**.*
20af0 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
20b00 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65   above, the inde
20b10 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54  x on t1(a) has T
20b20 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75  EXT affinity. Bu
20b30 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72  t since.** the r
20b40 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
20b50 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  f the equality c
20b60 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29  onstraint (t2.b)
20b70 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69   has NONE affini
20b80 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72  ty,.** no conver
20b90 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61  sion should be a
20ba0 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20  ttempted before 
20bb0 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c  using a t2.b val
20bc0 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ue as part of.**
20bd0 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68   a key to search
20be0 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63   the index. Henc
20bf0 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
20c00 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
20c10 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72   affinity.** str
20c20 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d  ing in this exam
20c30 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74  ple would be set
20c40 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   to SQLITE_AFF_N
20c50 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ONE..*/.static i
20c60 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69  nt codeAllEquali
20c70 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  tyTerms(.  Parse
20c80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20c90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20ca0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ext */.  WhereLe
20cb0 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f  vel *pLevel,   /
20cc0 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c  * Which nested l
20cd0 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  oop of the FROM 
20ce0 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f  we are coding */
20cf0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
20d00 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
20d10 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
20d20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
20d30 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68  dy,     /* Which
20d40 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68   parts of FROM h
20d50 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
20d60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
20d70 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20  nExtraReg,      
20d80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
20d90 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74  xtra registers t
20da0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
20db0 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20  char **pzAff    
20dc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
20dd0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66  t to point to af
20de0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
20df0 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
20e00 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
20e10 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ;   /* The numbe
20e20 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
20e30 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
20e40 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
20e50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
20e60 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75       /* The vm u
20e70 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
20e80 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
20e90 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
20ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
20eb0 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
20ec0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
20ed0 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
20ee0 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
20ef0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
20f00 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
20f10 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
20f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20f30 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
20f40 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
20f50 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
20f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20f70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20f80 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fa0 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
20fb0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20  /.  int nReg;   
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
20fe0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
20ff0 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
21000 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  zAff;           
21010 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
21020 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65  ity string to re
21030 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  turn */..  /* Th
21040 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c  is module is onl
21050 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72  y called on quer
21060 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65  y plans that use
21070 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
21080 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
21090 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
210a0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
210b0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
210c0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
210d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
210e0 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
210f0 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
21100 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
21110 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67  them..  */.  reg
21120 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Base = pParse->n
21130 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20  Mem + 1;.  nReg 
21140 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
21150 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
21160 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
21170 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
21180 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
21190 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
211a0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
211b0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
211c0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
211d0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
211e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
211f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c  ;.  }..  /* Eval
21200 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
21210 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
21220 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
21230 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
21240 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
21250 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
21260 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
21270 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
21280 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
21290 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
212a0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
212b0 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  y, pLevel->plan.
212c0 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a  wsFlags, pIdx);.
212d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54      if( NEVER(pT
212e0 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b  erm==0) ) break;
212f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
21300 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69  owing true for i
21310 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
21320 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
21330 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
21340 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
21350 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
21360 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
21370 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
21380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21390 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
213a0 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
213b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
213c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
213d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
213e0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
213f0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20  11662 */.    r1 
21400 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
21410 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
21420 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
21430 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
21440 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
21450 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21470 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21480 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
21490 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
214a0 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
214b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
214c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
214d0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
214e0 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
214f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21500 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
21510 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
21520 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
21530 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
21540 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
21550 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
21560 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
21570 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
21580 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ))==0 ){.      E
21590 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54  xpr *pRight = pT
215a0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
215b0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
215c0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
215d0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
215e0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
215f0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
21600 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20    if( zAff ){.  
21610 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21620 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
21630 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
21640 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
21650 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
21660 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
21670 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
21680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21690 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
216a0 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
216b0 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  e(pRight, zAff[j
216c0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
216d0 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45  zAff[j] = SQLITE
216e0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
216f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21700 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20   }.  }.  *pzAff 
21710 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e  = zAff;.  return
21720 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
21730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21740 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54  _EXPLAIN./*.** T
21750 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
21760 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c   helper for expl
21770 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20  ainIndexRange() 
21780 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72  below.**.** pStr
21790 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20   holds the text 
217a0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
217b0 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69   that we are bui
217c0 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72  lding up one ter
217d0 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20  m.** at a time. 
217e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
217f0 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  ds a new term to
21800 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21810 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
21820 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74  erms are separat
21830 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64  ed by AND so add
21840 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20   the "AND" text 
21850 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
21860 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72  ubsequent.** ter
21870 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ms only..*/.stat
21880 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41  ic void explainA
21890 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72  ppendTerm(.  Str
218a0 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20  Accum *pStr,    
218b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
218c0 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20  text expression 
218d0 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20  being built */. 
218e0 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20   int iTerm,     
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21900 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65  Index of this te
21910 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65  rm.  First is ze
21920 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ro */.  const ch
21930 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20  ar *zColumn,    
21940 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21950 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
21960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20  onst char *zOp  
21970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
21980 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  me of the operat
21990 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  or */.){.  if( i
219a0 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74  Term ) sqlite3St
219b0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
219c0 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a  r, " AND ", 5);.
219d0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
219e0 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43  mAppend(pStr, zC
219f0 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71  olumn, -1);.  sq
21a00 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
21a10 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
21a20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
21a30 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
21a40 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
21a50 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
21a60 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
21a70 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
21a80 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
21a90 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
21aa0 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
21ab0 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
21ac0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
21ad0 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ng a description
21ae0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65  .** of the subse
21af0 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20  t of table rows 
21b00 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73  scanned by the s
21b10 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66  trategy in the f
21b20 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c  orm of an.** SQL
21b30 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c   expression. Or,
21b40 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
21b50 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69   scanned, NULL i
21b60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
21b70 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
21b80 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  f the query:.**.
21b90 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
21ba0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20  OM t1 WHERE a=1 
21bb0 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69  AND b>2;.**.** i
21bc0 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20  s run and there 
21bd0 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  is an index on (
21be0 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73  a, b), then this
21bf0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21c00 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69  s a.** string si
21c10 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
21c20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a    "a=? AND b>?".
21c30 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
21c40 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
21c50 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  s to memory obta
21c60 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
21c70 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  3DbMalloc()..** 
21c80 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
21c90 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
21ca0 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
21cb0 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69  he buffer when i
21cc0 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  t is.** no longe
21cd0 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  r required..*/.s
21ce0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c  tatic char *expl
21cf0 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71  ainIndexRange(sq
21d00 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
21d10 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54  Level *pLevel, T
21d20 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57  able *pTab){.  W
21d30 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20  herePlan *pPlan 
21d40 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b  = &pLevel->plan;
21d50 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
21d60 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78   = pPlan->u.pIdx
21d70 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50  ;.  int nEq = pP
21d80 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20  lan->nEq;.  int 
21d90 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
21da0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
21db0 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75  l;.  int *aiColu
21dc0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
21dd0 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75  olumn;.  StrAccu
21de0 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45  m txt;..  if( nE
21df0 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e  q==0 && (pPlan->
21e00 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
21e10 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
21e20 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
21e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
21e40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
21e50 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c  rAccumInit(&txt,
21e60 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41   0, 0, SQLITE_MA
21e70 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74  X_LENGTH);.  txt
21e80 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
21e90 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
21ea0 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29  d(&txt, " (", 2)
21eb0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
21ec0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78  Eq; i++){.    ex
21ed0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
21ee0 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69  &txt, i, aCol[ai
21ef0 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
21f00 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a  , "=");.  }..  j
21f10 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61   = i;.  if( pPla
21f20 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45  n->wsFlags&WHERE
21f30 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
21f40 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d    char *z = (j==
21f50 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
21f60 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  ) ? "rowid" : aC
21f70 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
21f80 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
21f90 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
21fa0 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  t, i++, z, ">");
21fb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e  .  }.  if( pPlan
21fc0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
21fd0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
21fe0 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d 3d 70   char *z = (j==p
21ff0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
22000 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f   ? "rowid" : aCo
22010 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
22020 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69  Name;.    explai
22030 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
22040 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a 20 20  , i, z, "<");.  
22050 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
22060 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
22070 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
22080 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
22090 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
220a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
220b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
220c0 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
220d0 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
220e0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
220f0 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
22100 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
22110 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
22120 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
22130 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
22140 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
22150 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
22160 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
22170 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
22180 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
22190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
221a0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
221b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
221c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
221d0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
221e0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
221f0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
22200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
22210 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
22220 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
22230 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
22240 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
22250 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
22260 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
22270 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
22280 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
22290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
222a0 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
222b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
222c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
222d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
222e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
222f0 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
22300 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
22310 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
22340 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22350 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
22360 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
22370 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33  ain==2 ){.    u3
22380 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  2 flags = pLevel
22390 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
223a0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
223b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
223c0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
223d0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
223e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
223f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
22400 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
22410 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
22420 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
22430 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
22440 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
22450 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
22460 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
22470 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
22480 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
22490 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
224a0 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20  _int64 nRow;    
224b0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
224c0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
224d0 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61  s visited by sca
224e0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  n */.    int iId
224f0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
22500 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
22510 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
22520 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
22530 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
22540 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
22550 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
22560 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
22570 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20  or SCAN. */..   
22580 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
22590 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
225a0 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
225b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
225c0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
225d0 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65  sSearch = (pLeve
225e0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20  l->plan.nEq>0). 
225f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
22600 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
22610 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
22620 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
22630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
22640 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
22650 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
22660 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
22670 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22680 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
22690 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
226a0 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
226b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
226c0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
226d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
226e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
226f0 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
22700 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
22710 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
22720 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
22730 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
22740 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
22750 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
22760 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
22770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22780 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
22790 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
227a0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
227b0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
227c0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
227d0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
227e0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
227f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
22800 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
22810 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
22820 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
22830 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e   pLevel, pItem->
22840 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
22850 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22860 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22870 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45  s USING %s%sINDE
22880 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20  X%s%s%s", zMsg, 
22890 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
228a0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
228b0 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49  INDEX)?"AUTOMATI
228c0 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  C ":""),.       
228d0 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
228e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f  RE_IDX_ONLY)?"CO
228f0 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20  VERING ":""),.  
22900 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
22910 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
22920 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20  EX)?"":" "),.   
22930 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
22940 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
22950 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70  X)?"": pLevel->p
22960 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
22970 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57  e),.          zW
22980 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
22990 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
229a0 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
229b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
229c0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
229d0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
229e0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
229f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22a00 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22a10 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
22a20 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
22a30 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
22a40 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
22a50 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
22a60 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22a70 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22a80 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
22a90 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
22aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
22ab0 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
22ac0 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
22ad0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
22ae0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22af0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
22b00 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20  g, "%s (rowid>? 
22b10 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
22b20 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
22b30 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
22b40 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
22b50 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
22b60 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
22b70 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
22b80 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
22b90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
22ba0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
22bb0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
22bc0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
22bd0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
22be0 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
22bf0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
22c00 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
22c10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22c20 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
22c30 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
22c40 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
22c50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
22c60 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
22c70 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
22c80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
22c90 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  Idx;.      zMsg 
22ca0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22cb0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22cc0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
22cd0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
22ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22cf0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64      pVtabIdx->id
22d00 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e  xNum, pVtabIdx->
22d10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
22d20 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63  endif.    if( wc
22d30 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
22d40 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
22d50 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29  E_ORDERBY_MAX) )
22d60 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
22d70 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
22d80 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
22d90 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   );.      nRow =
22da0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
22db0 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c       nRow = (sql
22dc0 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65  ite3_int64)pLeve
22dd0 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  l->plan.nRow;.  
22de0 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
22df0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22e00 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
22e10 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
22e20 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
22e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
22e40 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
22e50 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
22e60 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
22e70 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
22e80 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
22e90 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
22ea0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
22eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
22ec0 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
22ed0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
22ee0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
22ef0 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
22f00 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
22f10 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
22f20 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
22f30 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
22f40 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
22f50 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
22f60 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
22f70 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
22f80 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
22f90 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
22fa0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
22fb0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
22fc0 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
22fd0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
22fe0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
22ff0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
23000 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
23010 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
23020 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
23030 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
23040 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
23050 2c 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61  ,    /* Which ta
23060 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
23070 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
23080 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20    Expr *pWhere  
23090 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
230a0 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
230b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
230c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
230d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
230e0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
230f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
23100 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
23110 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
23120 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
23130 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
23140 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
23150 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
23160 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
23170 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
23180 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
23190 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
231a0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
231b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
231c0 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
231d0 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
231e0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
231f0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
23200 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
23210 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
23220 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
23230 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
23240 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
23250 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
23260 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
23270 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
23280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
23290 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
232a0 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
232b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
232c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
232d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56  g context */.  V
232e0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23300 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
23310 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
23320 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
23330 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23340 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
23350 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
23360 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
23370 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
233a0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
233b0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
233c0 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233e0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
233f0 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
23400 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
23410 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
23420 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
23430 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
23440 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
23450 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
23460 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
23470 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
23480 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
23490 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
234a0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
234b0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
234c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
234d0 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66  e;.  pWC = pWInf
234e0 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c  o->pWC;.  pLevel
234f0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
23500 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65  evel];.  pTabIte
23510 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
23520 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
23530 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
23540 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
23550 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  sor;.  bRev = (p
23560 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
23570 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
23580 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54  RSE)!=0;.  omitT
23590 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
235a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
235b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
235c0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
235d0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
235e0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
235f0 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  )==0;..  /* Crea
23600 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
23610 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
23620 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
23630 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
23640 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
23650 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
23660 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
23670 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
23680 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
23690 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
236a0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
236b0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
236c0 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
236d0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
236e0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
236f0 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
23700 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
23710 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
23720 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
23730 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
23740 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
23750 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
23760 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
23770 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
23780 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
23790 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
237a0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
237b0 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
237c0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
237d0 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
237e0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
237f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23800 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
23810 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
23820 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
23830 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23840 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
23850 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
23860 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
23870 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
23880 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
23890 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
238a0 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
238b0 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
238c0 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
238d0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
238e0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
238f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
23900 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
23910 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
23920 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
23930 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
23940 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
23950 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23970 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23980 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
23990 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
239a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
239b0 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
239c0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
239d0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
239e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
239f0 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
23a00 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
23a10 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
23a20 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
23a30 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
23a40 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
23a50 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
23a60 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
23a70 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
23a80 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
23a90 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
23aa0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
23ab0 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
23ac0 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
23ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  .    sqlite3_ind
23ae0 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64  ex_info *pVtabId
23af0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
23b00 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20  .u.pVtabIdx;.   
23b10 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
23b20 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f   = pVtabIdx->nCo
23b30 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74  nstraint;.    st
23b40 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
23b50 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
23b60 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
23ba0 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
23bb0 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f  intUsage;.    co
23bc0 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
23bd0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
23be0 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74  int *aConstraint
23bf0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
23c30 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73  nstraint;..    s
23c40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
23c50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
23c60 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
23c70 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
23c80 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
23c90 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  2);.    for(j=1;
23ca0 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   j<=nConstraint;
23cb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
23cc0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
23cd0 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
23ce0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d     if( aUsage[k]
23cf0 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b  .argvIndex==j ){
23d00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
23d10 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
23d20 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[k].iTermOffse
23d30 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
23d40 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23d50 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72  rse, pWC->a[iTer
23d60 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m].pExpr->pRight
23d70 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20  , iReg+j+1);.   
23d80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23da0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f        if( k==nCo
23db0 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b  nstraint ) break
23dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23de0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74   OP_Integer, pVt
23df0 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69  abIdx->idxNum, i
23e00 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
23e10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23e20 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20  P_Integer, j-1, 
23e30 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c  iReg+1);.    sql
23e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
23e50 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
23e60 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65  ur, addrBrk, iRe
23e70 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  g, pVtabIdx->idx
23e80 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
23e90 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
23ea0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
23eb0 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e  dxStr ? P4_MPRIN
23ec0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
23ed0 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e  .    pVtabIdx->n
23ee0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
23ef0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
23f00 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
23f10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
23f20 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
23f30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
23f40 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
23f50 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
23f60 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  t;.        disab
23f70 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26  leTerm(pLevel, &
23f80 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a  pWC->a[iTerm]);.
23f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23fa0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
23fb0 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
23fc0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
23fd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
23fe0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
23ff0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24000 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24010 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
24020 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
24030 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
24040 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
24050 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
24060 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
24070 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
24080 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ABLE */..  if( p
24090 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
240a0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
240b0 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43  D_EQ ){.    /* C
240c0 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64  ase 1:  We can d
240d0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
240e0 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
240f0 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
24100 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
24110 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
24120 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
24130 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
24140 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
24150 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
24160 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
24170 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
24180 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
24190 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
241a0 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
241b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
241c0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
241d0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
241e0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
241f0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
24200 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
24210 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
24220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24230 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
24240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
24250 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
24260 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73  =iCur );.    ass
24270 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
24280 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
24290 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
242a0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
242b0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
242c0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
242d0 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
242e0 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
242f0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
24300 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  el, iReleaseReg)
24310 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
24320 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
24330 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
24350 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
24360 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
24370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24380 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
24390 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
243a0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
243b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
243c0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
243d0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
243e0 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
243f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
24400 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
24410 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
24420 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
24430 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
24440 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
24450 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  E ){.    /* Case
24460 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
24470 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
24480 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
24490 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
244a0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65     */.    int te
244b0 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
244c0 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
244d0 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c     int memEndVal
244e0 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72  ue = 0;.    Wher
244f0 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
24500 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72  pEnd;..    asser
24510 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
24520 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  );.    pStart = 
24530 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
24540 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
24550 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
24560 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69  );.    pEnd = fi
24570 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
24580 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
24590 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b  WO_LT|WO_LE, 0);
245a0 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b  .    if( bRev ){
245b0 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70  .      pTerm = p
245c0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74  Start;.      pSt
245d0 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
245e0 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
245f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
24600 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
24610 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
24620 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
24630 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e  ssion that defin
24640 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  es the start bou
24650 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
24660 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20  r1, rTemp;      
24670 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66    /* Registers f
24680 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  or holding the s
24690 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f  tart boundary */
246a0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ..      /* The f
246b0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
246c0 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64  t maps TK_xx cod
246d0 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f  es into correspo
246e0 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  nding .      ** 
246f0 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49  seek opcodes.  I
24700 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70  t depends on a p
24710 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69  articular orderi
24720 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20  ng of TK_xx.    
24730 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
24740 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20   u8 aMoveOp[] = 
24750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {.           /* 
24760 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GT */  OP_See
24770 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kGt,.           
24780 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f  /* TK_LE */  OP_
24790 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20  SeekLe,.        
247a0 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20     /* TK_LT */  
247b0 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20  OP_SeekLt,.     
247c0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a        /* TK_GE *
247d0 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20  /  OP_SeekGe.   
247e0 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65     };.      asse
247f0 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54  rt( TK_LE==TK_GT
24800 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61  +1 );      /* Ma
24810 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65  ke sure the orde
24820 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ring.. */.      
24830 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
24840 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f  K_GT+2 );      /
24850 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b  *  ... of the TK
24860 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f  _xx values... */
24870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
24880 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b  K_GE==TK_GT+3 );
24890 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73        /*  ... is
248a0 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20   correcct. */.. 
248b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
248c0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
248d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
248e0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
248f0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70  11662 */.      p
24900 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
24910 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
24920 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
24930 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
24940 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
24950 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
24960 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24970 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  mp(pParse, pX->p
24980 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a  Right, &rTemp);.
24990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
249a0 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65  eAddOp3(v, aMove
249b0 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d  Op[pX->op-TK_GT]
249c0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
249d0 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
249e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
249f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
24a00 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
24a10 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
24a20 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   r1, 1);.      s
24a30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24a40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65  pReg(pParse, rTe
24a50 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62  mp);.      disab
24a60 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
24a70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
24a80 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
24a90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
24aa0 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
24ab0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
24ac0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a  addrBrk);.    }.
24ad0 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
24ae0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
24af0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
24b00 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
24b10 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
24b20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
24b30 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  d->leftCursor==i
24b40 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Cur );.      tes
24b50 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46  tcase( pEnd->wtF
24b60 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
24b70 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
24b80 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
24b90 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
24ba0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24bb0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
24bc0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
24bd0 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
24be0 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
24bf0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
24c00 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
24c10 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
24c20 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
24c30 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
24c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24c50 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
24c60 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
24c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24c80 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
24c90 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
24ca0 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
24cb0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
24cc0 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
24cd0 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
24ce0 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
24cf0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
24d00 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
24d10 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
24d20 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
24d30 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29  ==0 && pEnd==0 )
24d40 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
24d50 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
24d60 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
24d70 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  STEP;.    }else{
24d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24d90 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a  Level->p5==0 );.
24da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
24db0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
24dc0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
24dd0 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
24de0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
24df0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
24e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24e10 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
24e20 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
24e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24e40 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
24e50 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
24e60 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
24e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24e80 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
24e90 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
24ea0 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
24eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24ec0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
24ed0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
24ee0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
24ef0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
24f00 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
24f10 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24f20 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
24f30 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
24f40 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20  N_EQ) ){.    /* 
24f50 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
24f60 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
24f70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
24f80 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
24f90 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
24fa0 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
24fb0 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
24fc0 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
24fd0 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
24fe0 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
24ff0 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
25000 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
25010 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
25020 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
25030 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
25040 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
25050 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25060 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
25070 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
25080 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
25090 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
250a0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
250b0 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
250c0 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
250d0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
250e0 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
250f0 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
25100 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
25110 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
25120 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
25130 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
25140 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
25150 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
25160 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
25170 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
25180 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
25190 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
251a0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
251b0 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
251c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
251d0 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
251e0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
251f0 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
25200 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
25210 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
25220 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
25230 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
25240 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
25250 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
25260 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
25270 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
25280 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
25290 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
252a0 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
252b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
252c0 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
252d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
252e0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
252f0 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
25300 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
25310 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
25320 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
25330 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
25340 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
25350 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
25360 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
25370 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
25380 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
25390 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
253a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
253b0 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
253c0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
253d0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
253e0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
253f0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
25400 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
25410 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
25420 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
25430 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
25440 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
25450 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
25460 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
25470 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74     */  .    stat
25480 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61  ic const u8 aSta
25490 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
254a0 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
254b0 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
254c0 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
254d0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
254e0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
254f0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
25500 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
25510 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
25520 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
25530 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
25540 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
25550 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
25560 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
25570 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
25580 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
25590 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
255a0 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
255b0 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
255c0 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
255d0 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
255e0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
255f0 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
25600 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
25610 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
25620 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
25630 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
25640 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
25650 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
25660 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
25670 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
25680 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74  .    };.    stat
25690 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64  ic const u8 aEnd
256a0 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f  Op[] = {.      O
256b0 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
256c0 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
256d0 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
256e0 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20        OP_IdxGE, 
256f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a             /* 1:
25700 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
25710 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  s && !bRev) */. 
25720 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
25730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
25740 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
25750 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
25760 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20   };.    int nEq 
25770 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  = pLevel->plan.n
25780 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  Eq;  /* Number o
25790 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73  f == or IN terms
257a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69   */.    int isMi
257b0 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  nQuery = 0;     
257c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
257d0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
257e0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
257f0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
25800 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
25810 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
25820 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
25830 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
25840 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20  /.    int r1;   
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
25870 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ter */.    Where
25880 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
25890 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
258a0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
258b0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
258c0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
258d0 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
258e0 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
258f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
25900 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
25910 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25930 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
25940 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
25950 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
25960 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
25970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25980 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
25990 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
259a0 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
259b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
259c0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
259d0 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
259e0 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
259f0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
25a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25a10 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
25a20 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
25a30 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25a50 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
25a60 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
25a70 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a90 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
25aa0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
25ab0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
25ac0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
25ad0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25ae0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
25af0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
25b00 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
25b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25b20 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
25b30 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
25b40 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
25b50 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
25b60 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
25b70 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
25b80 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  */.    char *zEn
25b90 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dAff;           
25ba0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
25bb0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
25bc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a   constraint */..
25bd0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
25be0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
25bf0 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c      iIdxCur = pL
25c00 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
25c10 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64     k = (nEq==pId
25c20 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20  x->nColumn ? -1 
25c30 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  : pIdx->aiColumn
25c40 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  [nEq]);..    /* 
25c50 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74  If this loop sat
25c60 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72  isfies a sort or
25c70 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72  der (pOrderBy) r
25c80 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20  equest that .   
25c90 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74   ** was passed t
25ca0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
25cb0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22  to implement a "
25cc0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e  SELECT min(x) ..
25cd0 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ." .    ** query
25ce0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
25cf0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
25d00 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
25d10 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73  n for.    ** a s
25d20 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
25d30 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
25d40 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
25d50 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73  eturned.    ** s
25d60 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61  hould not have a
25d70 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72   NULL value stor
25d80 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f  ed in 'x'. If co
25d90 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20  lumn 'x' is.    
25da0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
25db0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
25dc0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25dd0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
25de0 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65  ,.    ** this re
25df0 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63  quires some spec
25e00 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  ial handling..  
25e10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63    */.    if( (wc
25e20 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  trlFlags&WHERE_O
25e30 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20  RDERBY_MIN)!=0. 
25e40 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
25e50 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
25e60 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20  RE_ORDERBY).    
25e70 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   && (pIdx->nColu
25e80 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  mn>nEq).    ){. 
25e90 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
25ea0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
25eb0 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  =1 ); */.      /
25ec0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
25ed0 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
25ee0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
25ef0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20  iColumn[nEq] ); 
25f00 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75  */.      isMinQu
25f10 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ery = 1;.      n
25f20 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
25f30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
25f40 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
25f50 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
25f60 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
25f70 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
25f80 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
25f90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
25fa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
25fb0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
25fc0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
25fd0 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72  ngeEnd = findTer
25fe0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
25ff0 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54  notReady, (WO_LT
26000 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a  |WO_LE), pIdx);.
26010 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
26020 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
26030 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
26040 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26050 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
26060 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d     pRangeStart =
26070 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
26080 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
26090 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c  , (WO_GT|WO_GE),
260a0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45   pIdx);.      nE
260b0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
260c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
260d0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
260e0 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
260f0 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
26100 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20  == or IN.    ** 
26110 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61  and store the va
26120 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
26130 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rms in an array 
26140 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
26150 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
26160 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  regBase..    */.
26170 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f      regBase = co
26180 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
26190 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  ms(.        pPar
261a0 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c  se, pLevel, pWC,
261b0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72   notReady, nExtr
261c0 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66  aReg, &zStartAff
261d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64  .    );.    zEnd
261e0 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
261f0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
26200 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
26210 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
26220 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20  el->addrNxt;..  
26230 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
26240 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f  oing a reverse o
26250 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20  rder scan on an 
26260 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  ascending index,
26270 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72   or.    ** a for
26280 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
26290 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
262a0 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
262b0 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  ge the .    ** s
262c0 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72  tart and end ter
262d0 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20  ms (pRangeStart 
262e0 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a  and pRangeEnd)..
262f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
26300 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  nEq<pIdx->nColum
26310 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78  n && bRev==(pIdx
26320 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
26330 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
26340 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65 76  )).     || (bRev
26350 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   && pIdx->nColum
26360 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  n==nEq).    ){. 
26370 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54       SWAP(WhereT
26380 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64  erm *, pRangeEnd
26390 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
263a0 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
263b0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
263c0 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
263d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
263e0 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
263f0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
26400 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
26410 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
26420 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
26430 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
26440 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
26450 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
26460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
26470 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
26480 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
26490 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73  & WO_GE );.    s
264a0 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
264b0 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
264c0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
264d0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
264e0 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21  .    endEq =   !
264f0 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61  pRangeEnd || pRa
26500 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
26510 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
26520 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  );.    start_con
26530 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67  straints = pRang
26540 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b  eStart || nEq>0;
26550 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
26560 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74  e index cursor t
26570 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
26580 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
26590 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e   nConstraint = n
265a0 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e  Eq;.    if( pRan
265b0 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  geStart ){.     
265c0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
265d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78  pRangeStart->pEx
265e0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
265f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26600 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
26610 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
26620 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
26630 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
26640 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
26650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26660 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
26670 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
26680 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
26690 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  drNxt);.      }.
266a0 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74        if( zStart
266b0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
266c0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
266d0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
266e0 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
266f0 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
26700 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
26710 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
26720 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
26730 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
26740 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
26750 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
26760 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
26770 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
26780 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
26790 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
267a0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
267b0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
267c0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
267d0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
267e0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
267f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26800 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
26810 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
26820 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41  (pRight, zStartA
26830 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
26840 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
26850 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
26860 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
26870 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
26880 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
26890 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
268a0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74   pRangeStart->wt
268b0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
268c0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
268d0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
268e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
268f0 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
26900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26910 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
26920 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
26930 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
26940 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
26950 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
26960 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
26970 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
26980 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
26990 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
269a0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20  e, nConstraint, 
269b0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
269c0 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
269d0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
269e0 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
269f0 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
26a00 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
26a10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26a20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
26a30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
26a40 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
26a50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26a60 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20  OP_SeekGt );.   
26a70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
26a80 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20  P_SeekGe );.    
26a90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26aa0 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74  _SeekLe );.    t
26ab0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26ac0 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71  SeekLt );.    sq
26ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
26ae0 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  nt(v, op, iIdxCu
26af0 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42  r, addrNxt, regB
26b00 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
26b10 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  );..    /* Load 
26b20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
26b30 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
26b40 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65  straint at the e
26b50 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
26b60 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
26b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  .    */.    nCon
26b80 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
26b90 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64     if( pRangeEnd
26ba0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
26bb0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45  pRight = pRangeE
26bc0 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  nd->pExpr->pRigh
26bd0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
26be0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
26bf0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b  pParse, regBase+
26c00 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  nEq, 1);.      s
26c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
26c20 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
26c30 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
26c40 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
26c50 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
26c60 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
26c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26c80 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
26c90 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
26ca0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
26cb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26cc0 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a   if( zEndAff ){.
26cd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26ce0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
26cf0 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ty(pRight, zEndA
26d00 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45  ff[nEq])==SQLITE
26d10 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20  _AFF_NONE){.    
26d20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74        /* Since t
26d30 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
26d40 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64   to be performed
26d50 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73   with no convers
26d60 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ions.          *
26d70 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65  * applied to the
26d80 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74   operands, set t
26d90 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61  he affinity to a
26da0 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74  pply to pRight t
26db0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  o .          ** 
26dc0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
26dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a    */.          z
26de0 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  EndAff[nEq] = SQ
26df0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
26e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e10 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
26e20 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
26e30 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45  hange(pRight, zE
26e40 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  ndAff[nEq]) ){. 
26e50 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
26e60 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
26e70 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
26e80 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
26e90 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
26ea0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
26eb0 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e  Base, nEq+1, zEn
26ec0 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f  dAff);.      nCo
26ed0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
26ee0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
26ef0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
26f00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
26f10 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
26f20 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  11662 */.    }. 
26f30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26f40 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74  (pParse->db, zSt
26f50 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  artAff);.    sql
26f60 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
26f70 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b  e->db, zEndAff);
26f80 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
26f90 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
26fa0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
26fb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
26fc0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
26fd0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
26fe0 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
26ff0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
27000 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
27010 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
27020 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
27030 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
27040 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
27050 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
27060 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
27070 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
27080 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
27090 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
270a0 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
270b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
270c0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
270d0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
270e0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
270f0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
27100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
27110 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21  angeP5(v, endEq!
27120 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20  =bRev ?1:0);.   
27130 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27140 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
27150 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
27160 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
27170 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  alue.    ** of t
27180 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
27190 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c  that the inequal
271a0 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73  ity contrains is
271b0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
271c0 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70  * If it is, jump
271d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
271e0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
271f0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
27200 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
27210 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
27220 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
27230 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
27240 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
27250 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  MIT );.    testc
27260 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
27270 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27280 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
27290 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
272a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
272b0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
272c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
272d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
272e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
272f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
27300 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
27310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
27330 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43  sNull, r1, addrC
27340 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ont);.    }.    
27350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
27360 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
27370 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  );..    /* Seek 
27380 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
27390 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
273a0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
273b0 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53  (pLevel, pRangeS
273c0 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62  tart);.    disab
273d0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
273e0 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69  RangeEnd);.    i
273f0 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
27400 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
27410 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
27420 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27430 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
27440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27450 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
27460 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
27470 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
27480 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
27490 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
274a0 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
274b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
274c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
274d0 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
274e0 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
274f0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
27500 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f    }..    /* Reco
27510 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
27520 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
27530 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
27540 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57  isable .    ** W
27550 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
27560 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74  s made redundant
27570 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61   by the index ra
27580 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f  nge scan..    */
27590 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
275a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
275b0 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a  WHERE_UNIQUE ){.
275c0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
275d0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
275e0 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
275f0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
27600 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
27610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
27620 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
27630 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
27640 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
27650 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  Cur;.  }else..#i
27660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27670 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
27680 4e 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  N.  if( pLevel->
27690 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
276a0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
276b0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20  .    /* Case 4: 
276c0 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   Two or more sep
276d0 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20  arately indexed 
276e0 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
276f0 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20  by OR.    **.   
27700 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
27710 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45   **.    **   CRE
27720 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62  ATE TABLE t1(a,b
27730 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  ,c,d);.    **   
27740 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
27750 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a  ON t1(a);.    **
27760 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
27770 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20  i2 ON t1(b);.   
27780 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
27790 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a  EX i3 ON t1(c);.
277a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
277b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
277c0 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d   WHERE a=5 OR b=
277d0 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64  7 OR (c=11 AND d
277e0 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  =13).    **.    
277f0 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
27800 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72  e, there are thr
27810 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ee indexed terms
27820 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
27830 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70  ..    ** The top
27840 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f   of the loop loo
27850 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ks like this:.  
27860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
27870 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
27880 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
27890 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
278a0 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
278b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20  **.    ** Then, 
278c0 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64  for each indexed
278d0 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f   term, the follo
278e0 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65  wing. The argume
278f0 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f  nts to.    ** Ro
27900 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63  wSetTest are suc
27910 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  h that the rowid
27920 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
27930 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a  row is inserted.
27940 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
27950 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73  RowSet. If it is
27960 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
27970 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  , control skips 
27980 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62  the.    ** Gosub
27990 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70   opcode and jump
279a0 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68  s straight to th
279b0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
279c0 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a   by WhereEnd()..
279d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
279e0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
279f0 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20  eBegin(<term>). 
27a00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
27a10 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20  owSetTest       
27a20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73             # Ins
27a30 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72  ert rowid into r
27a40 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20  owset.    **    
27a50 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20        Gosub     
27a60 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20   2 A.    **     
27a70 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
27a80 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nd().    **.    
27a90 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** Following the
27aa0 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20   above, code to 
27ab0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
27ac0 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65  op. Label A, the
27ad0 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f   target.    ** o
27ae0 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76  f the Gosub abov
27af0 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20  e, jumps to the 
27b00 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68  instruction righ
27b10 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f  t after the Goto
27b20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27b30 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
27b40 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
27b50 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
27b60 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
27b70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
27b80 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20  Goto       B    
27b90 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68              # Th
27ba0 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68  e loop is finish
27bb0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
27bc0 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70  *       A: <loop
27bd0 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20   body>          
27be0 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20         # Return 
27bf0 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a  data, whatever..
27c00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
27c10 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20         Return   
27c20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
27c30 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74     # Jump back t
27c40 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20  o the Gosub.    
27c50 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
27c60 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f  B: <after the lo
27c70 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  op>.    **.    *
27c80 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  /.    WhereClaus
27c90 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20  e *pOrWc;    /* 
27ca0 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72  The OR-clause br
27cb0 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75  oken out into su
27cc0 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72  bterms */.    Sr
27cd0 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20  cList *pOrTab;  
27ce0 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65       /* Shortene
27cf0 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20  d table list or 
27d00 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61  OR-clause genera
27d10 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  tion */..    int
27d20 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
27d30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
27d40 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
27d50 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
27d60 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
27d70 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d90 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
27da0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
27db0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
27dc0 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
27df0 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
27e00 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
27e10 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
27e20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
27e30 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
27e40 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
27e50 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
27e80 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
27e90 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
27ea0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
27eb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
27ec0 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
27ed0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
27ee0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
27ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f10 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
27f20 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78      Expr *pAndEx
27f30 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pr = 0;         
27f40 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e         /* An "..
27f50 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72   AND (...)" expr
27f60 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20  ession */.   .  
27f70 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
27f80 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
27f90 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
27fa0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
27fb0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
27fc0 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20  ator==WO_OR );. 
27fd0 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
27fe0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27ff0 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
28000 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
28010 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
28020 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
28030 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
28040 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
28050 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
28060 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
28070 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61  SrcList ni pOrTa
28080 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
28090 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
280a0 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
280b0 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
280c0 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
280d0 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
280e0 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
280f0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
28100 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
28110 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
28120 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
28130 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
28140 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28150 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
28160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
28170 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
28180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28190 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
281a0 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
281b0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
281c0 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
281d0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
281e0 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
281f0 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
28200 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
28210 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
28220 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
28230 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
28240 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
28250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
28270 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
28280 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
28290 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
282a0 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
282b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
282c0 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
282d0 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69  Tab->nAlloc = (i
282e0 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  16)(nNotReady + 
282f0 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
28300 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
28310 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
28320 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
28330 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
28340 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
28350 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
28360 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
28370 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
28380 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
28390 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
283a0 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
283b0 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
283c0 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
283d0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
283e0 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
283f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28400 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
28410 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
28420 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
28430 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
28440 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
28450 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
28460 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
28470 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
28480 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
28490 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
284a0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
284b0 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
284c0 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
284d0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
284e0 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
284f0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
28500 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
28510 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
28520 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
28530 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
28540 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
28550 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
28560 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
28570 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
28580 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
28590 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
285a0 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
285b0 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
285c0 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
285d0 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
285e0 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
285f0 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
28600 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
28610 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
28620 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
28630 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
28640 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
28650 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
28660 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
28670 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
28680 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
28690 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
286a0 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
286b0 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
286c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
286d0 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
286e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
286f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
28710 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
28720 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  t);.    }.    iR
28730 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
28740 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28750 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
28760 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a  Return);..    /*
28770 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
28780 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
28790 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20   z of the form: 
287a0 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e   (x1 OR x2 OR ..
287b0 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20  .) AND y.    ** 
287c0 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74  Then for every t
287d0 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65  erm xN, evaluate
287e0 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65   as the subexpre
287f0 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a  ssion: xN AND z.
28800 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c      ** That way,
28810 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74   terms in y that
28820 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e   are factored in
28830 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69  to the disjuncti
28840 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  on will.    ** b
28850 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74  e picked up by t
28860 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
28870 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ls to sqlite3Whe
28880 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e  reBegin() below.
28890 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
288a0 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75  ctually, each su
288b0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63  bexpression is c
288c0 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20  onverted to "xN 
288d0 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69  AND w" where w i
288e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e  s.    ** the "in
288f0 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73  teresting" terms
28900 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68   of z - terms th
28910 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  at did not origi
28920 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  nate in the.    
28930 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ** ON or USING c
28940 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
28950 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20  JOIN, and terms 
28960 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20  that are usable 
28970 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  as .    ** indic
28980 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
28990 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20  f( pWC->nTerm>1 
289a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
289b0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
289c0 20 69 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20   ii<pWC->nTerm; 
289d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  ii++){.        E
289e0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
289f0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 3b 0a 20  ->a[ii].pExpr;. 
28a00 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
28a10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
28a20 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
28a30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28a40 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 69     if( pWC->a[ii
28a50 5d 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ].wtFlags & (TER
28a60 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f  M_VIRTUAL|TERM_O
28a70 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75  RINFO) ) continu
28a80 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
28a90 70 57 43 2d 3e 61 5b 69 69 5d 2e 65 4f 70 65 72  pWC->a[ii].eOper
28aa0 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
28ab0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
28ac0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
28ad0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
28ae0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
28af0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  0);.        pAnd
28b00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
28b10 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
28b20 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70  , pAndExpr, pExp
28b30 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28b40 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
28b50 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78  {.        pAndEx
28b60 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
28b70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44  r(pParse, TK_AND
28b80 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30  , 0, pAndExpr, 0
28b90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28ba0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
28bb0 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
28bc0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
28bd0 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
28be0 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
28bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
28c00 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
28c10 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d  =iCur || pOrTerm
28c20 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
28c30 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 57  AND ){.        W
28c40 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
28c50 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
28c60 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
28c70 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
28c80 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
28c90 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72 6d  OrExpr = pOrTerm
28ca0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
28cb0 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
28cc0 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
28cd0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
28ce0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
28cf0 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
28d00 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
28d10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
28d20 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
28d30 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
28d40 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
28d50 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
28d60 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
28d70 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
28d80 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30  rTab, pOrExpr, 0
28d90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
28db0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
28dc0 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f  SE | WHERE_AND_O
28dd0 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NLY |.          
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
28df0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20  ERE_FORCE_TABLE 
28e00 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
28e10 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20  _ONLY);.        
28e20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
28e30 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
28e40 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20  inOneScan(.     
28e50 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
28e60 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
28e70 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65  nfo->a[0], iLeve
28e80 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  l, pLevel->iFrom
28e90 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b  , 0.          );
28ea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
28eb0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28ec0 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
28ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
28ee0 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
28ef0 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
28f00 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
28f10 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
28f20 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
28f30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
28f40 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
28f50 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
28f60 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b 0a       regRowid);.
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28fb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
28fc0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
28fd0 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
29000 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
29010 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
29020 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
29030 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
29040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29050 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
29060 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
29070 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
29080 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
29090 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
290a0 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
290b0 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
290c0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
290d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
290e0 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
290f0 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
29100 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
29110 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
29120 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
29130 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
29140 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
29150 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
29160 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
29170 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
29180 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
29190 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
291a0 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
291b0 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
291c0 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
291d0 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
291e0 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
291f0 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
29200 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
29210 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
29220 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
29230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29240 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29250 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
29260 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
29270 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
29280 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
29290 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78  arse->db, pAndEx
292a0 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  pr);.    }.    s
292b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
292c0 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
292d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
292e0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
292f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29300 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
29310 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
29320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29330 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
29340 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
29350 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
29360 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
29370 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73  3StackFree(pPars
29380 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  e->db, pOrTab);.
29390 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
293a0 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
293b0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
293c0 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
293d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
293e0 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
293f0 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
29400 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65  * Case 5:  There
29410 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
29420 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
29430 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
29440 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
29450 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
29460 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
29470 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
29480 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
29490 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
294a0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
294b0 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
294c0 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
294d0 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
294e0 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
294f0 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  Rev==1 );.    as
29500 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
29510 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 );.    pLevel
29520 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
29530 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v];.    pLevel->
29540 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
29550 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
29560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29570 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
29580 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
29590 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
295a0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
295b0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
295c0 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65  TEP;.  }.  notRe
295d0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
295e0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
295f0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
29600 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
29610 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
29620 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
29630 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
29640 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
29650 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
29660 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  f tables..  **. 
29670 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
29680 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35  ON-OF: R-49525-5
29690 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20  0935 Terms that 
296a0 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66  cannot be satisf
296b0 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ied through.  **
296c0 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69   the use of indi
296d0 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73  ces become tests
296e0 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61   that are evalua
296f0 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68  ted against each
29700 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65   row of.  ** the
29710 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20   relevant input 
29720 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
29730 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
29740 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
29750 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
29760 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b  ){.    Expr *pE;
29770 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
29780 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
29790 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
297a0 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d  /* IMP: R-30575-
297b0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73  11662 */.    tes
297c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
297d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
297e0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
297f0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
29800 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
29810 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
29820 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
29830 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
29840 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b   notReady)!=0 ){
29850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29860 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
29870 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20  dTerms==0.      
29880 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49           && (pWI
29890 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
298a0 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  & WHERE_ONETABLE
298b0 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20  _ONLY)!=0 );.   
298c0 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73     pWInfo->untes
298d0 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20  tedTerms = 1;.  
298e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
298f0 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65    }.    pE = pTe
29900 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61  rm->pExpr;.    a
29910 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
29920 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
29930 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
29940 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
29950 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
29960 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
29970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29980 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
29990 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43  Parse, pE, addrC
299a0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
299b0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65  IFNULL);.    pTe
299c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
299d0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a  ERM_CODED;.  }..
299e0 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
299f0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
29a00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
29a10 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
29a20 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74  act that.  ** at
29a30 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f   least one row o
29a40 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
29a50 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68  e has matched th
29a60 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a  e left table.  .
29a70 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
29a80 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
29a90 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
29aa0 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
29ab0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
29ac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29ad0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
29ae0 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65  nteger, 1, pLeve
29af0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
29b00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29b10 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
29b20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
29b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29b40 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29b50 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
29b60 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43  C->a, j=0; j<pWC
29b70 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54  ->nTerm; j++, pT
29b80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65  erm++){.      te
29b90 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
29ba0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
29bb0 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50  RTUAL );  /* IMP
29bc0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
29bd0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
29be0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
29bf0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
29c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
29c10 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
29c20 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
29c30 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
29c40 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  e;.      if( (pT
29c50 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
29c60 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b   notReady)!=0 ){
29c70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29c80 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
29c90 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20  dTerms );.      
29ca0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
29cb0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
29cc0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  ( pTerm->pExpr )
29cd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29ce0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
29cf0 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
29d00 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
29d10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
29d20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
29d30 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
29d40 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  D;.    }.  }.  s
29d50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
29d60 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
29d70 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65  leaseReg);..  re
29d80 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d  turn notReady;.}
29d90 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
29da0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
29db0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
29dc0 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20  ariable holds a 
29dd0 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
29de0 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67   of query plan g
29df0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74  enerated.** by t
29e00 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
29e10 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
29e20 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63  ereBegin().  Eac
29e30 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42  h call to WhereB
29e40 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74  egin.** overwrit
29e50 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  es the previous.
29e60 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
29e70 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  on is used for t
29e80 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e  esting and.** an
29e90 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
29ea0 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65  char sqlite3_que
29eb0 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30  ry_plan[BMS*2*40
29ec0 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74  ];  /* Text of t
29ed0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69  he join */.stati
29ee0 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30  c int nQPlan = 0
29ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29f00 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77  * Next free slow
29f10 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b   in _query_plan[
29f20 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ] */..#endif /* 
29f30 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
29f40 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
29f50 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
29f60 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
29f70 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73   whereInfoFree(s
29f80 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
29f90 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
29fa0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49    if( ALWAYS(pWI
29fb0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  nfo) ){.    int 
29fc0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
29fd0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
29fe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
29ff0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
2a000 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f   *pInfo = pWInfo
2a010 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[i].pIdxInfo;
2a020 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
2a030 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61   ){.        /* a
2a040 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65  ssert( pInfo->ne
2a050 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d  edToFreeIdxStr==
2a060 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2a070 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20  ailed ); */.    
2a080 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
2a090 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
2a0a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2a0b0 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d  ite3_free(pInfo-
2a0c0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  >idxStr);.      
2a0d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2a0e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2a0f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nfo);.      }.  
2a100 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2a110 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  a[i].plan.wsFlag
2a120 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2a130 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20  NDEX ){.        
2a140 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57  Index *pIdx = pW
2a150 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e  Info->a[i].plan.
2a160 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  u.pIdx;.        
2a170 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2a180 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2a190 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43  ree(db, pIdx->zC
2a1a0 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20  olAff);.        
2a1b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2a1c0 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  db, pIdx);.     
2a1d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a1e0 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75   }.    whereClau
2a1f0 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e  seClear(pWInfo->
2a200 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pWC);.    sqlite
2a210 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
2a220 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  fo);.  }.}.../*.
2a230 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
2a240 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2a250 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
2a260 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2a270 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
2a280 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
2a290 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2a2a0 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
2a2b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
2a2c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
2a2d0 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
2a2e0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
2a2f0 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
2a300 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
2a310 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
2a320 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
2a330 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2a340 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a350 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
2a360 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
2a370 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2a380 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
2a390 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2a3a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2a3b0 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
2a3c0 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
2a3d0 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
2a3e0 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
2a3f0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
2a400 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
2a410 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
2a420 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
2a430 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
2a440 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
2a450 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
2a460 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
2a470 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
2a480 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
2a490 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
2a4a0 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
2a4b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
2a4c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
2a4d0 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
2a4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
2a4f0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
2a500 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
2a510 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
2a520 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
2a530 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
2a540 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
2a550 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
2a560 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2a570 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
2a580 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
2a590 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
2a5a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2a5b0 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
2a5c0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
2a5d0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
2a5e0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2a5f0 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
2a600 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
2a610 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
2a640 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
2a650 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
2a680 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
2a690 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
2a6a0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
2a6b0 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
2a6c0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
2a6d0 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
2a6e0 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
2a6f0 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
2a700 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
2a710 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
2a720 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
2a730 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
2a740 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
2a750 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
2a760 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
2a770 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
2a780 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
2a790 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
2a7a0 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
2a7b0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2a7c0 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
2a7d0 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
2a7e0 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
2a7f0 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
2a800 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
2a810 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
2a820 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
2a830 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
2a840 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
2a850 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
2a860 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
2a870 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
2a880 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
2a890 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
2a8a0 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
2a8b0 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
2a8c0 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
2a8d0 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
2a8e0 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
2a8f0 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
2a900 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2a910 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
2a920 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
2a930 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
2a940 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
2a950 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
2a960 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
2a970 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
2a980 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
2a990 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
2a9a0 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
2a9b0 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
2a9c0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
2a9d0 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
2a9e0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
2a9f0 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
2aa00 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
2aa10 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
2aa20 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
2aa30 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
2aa40 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
2aa50 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
2aa60 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
2aa70 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
2aa80 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
2aa90 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
2aaa0 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
2aab0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2aac0 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
2aad0 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
2aae0 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
2aaf0 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
2ab00 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
2ab10 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
2ab20 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
2ab30 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
2ab40 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
2ab50 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
2ab60 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
2ab70 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
2ab80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
2ab90 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
2aba0 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
2abb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2abc0 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
2abd0 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
2abe0 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
2abf0 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
2ac00 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
2ac10 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
2ac20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
2ac30 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
2ac40 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2ac50 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
2ac60 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
2ac70 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
2ac80 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
2ac90 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
2aca0 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
2acb0 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
2acc0 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
2acd0 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
2ace0 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
2acf0 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
2ad00 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
2ad10 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
2ad20 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
2ad30 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
2ad40 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
2ad50 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
2ad60 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
2ad70 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2ad80 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
2ad90 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
2ada0 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
2adb0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
2adc0 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
2add0 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
2ade0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
2adf0 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
2ae00 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
2ae10 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
2ae20 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
2ae30 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
2ae40 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
2ae50 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
2ae60 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
2ae70 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
2ae80 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
2ae90 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
2aea0 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
2aeb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
2aec0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
2aed0 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2aee0 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
2aef0 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
2af00 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
2af10 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
2af20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2af30 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
2af40 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2af50 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
2af60 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
2af70 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
2af80 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
2af90 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
2afa0 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
2afb0 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
2afc0 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
2afd0 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
2afe0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2aff0 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
2b000 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
2b010 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
2b020 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
2b030 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2b040 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
2b050 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
2b060 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
2b070 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
2b080 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
2b090 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
2b0a0 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
2b0b0 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
2b0c0 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
2b0d0 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
2b0e0 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
2b0f0 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
2b100 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
2b110 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
2b120 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
2b130 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
2b140 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
2b150 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
2b160 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2b170 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2b180 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
2b190 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
2b1a0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2b1b0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
2b1c0 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
2b1d0 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
2b1e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2b1f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2b200 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
2b210 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  , /* An ORDER BY
2b220 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
2b230 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2b240 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54  pDistinct,  /* T
2b250 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 66  he select-list f
2b260 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
2b270 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ies - or NULL */
2b280 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
2b290 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  s        /* One 
2b2a0 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
2b2b0 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
2b2c0 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29  sqliteInt.h */.)
2b2d0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b2f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b300 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e  /.  int nByteWIn
2b310 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
2b320 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c  * Num. bytes all
2b330 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65  ocated for Where
2b340 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20  Info struct */. 
2b350 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20   int nTabList;  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b370 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2b380 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f  s in pTabList */
2b390 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
2b3a0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
2b3b0 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
2b3c0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
2b3d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
2b3e0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
2b3f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
2b400 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
2b410 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
2b420 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
2b430 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
2b440 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
2b450 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
2b460 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  oned */.  WhereM
2b470 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2b480 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  ;    /* The expr
2b490 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
2b4a0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
2b4b0 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
2b4c0 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
2b4d0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45  ition of the WHE
2b4e0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
2b4f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b500 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
2b510 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
2b520 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
2b530 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
2b540 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
2b550 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
2b560 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
2b570 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  nfo list */.  in
2b580 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b5a0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
2b5b0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
2b5c0 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
2b5d0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2b5e0 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
2b5f0 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70  ination of all p
2b600 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20  WC->a[].wtFlags 
2b610 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2b620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b630 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
2b640 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ection */..  /* 
2b650 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
2b660 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2b670 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2b680 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
2b690 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
2b6a0 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
2b6b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
2b6c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53  bList->nSrc==BMS
2b6d0 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69   );.  if( pTabLi
2b6e0 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
2b6f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2b700 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
2b710 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
2b720 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
2b730 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2b740 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2b750 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20  nction normally 
2b760 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74  generates a nest
2b770 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20  ed loop for all 
2b780 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20  tables in .  ** 
2b790 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69  pTabList.  But i
2b7a0 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54  f the WHERE_ONET
2b7b0 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
2b7c0 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73  s set, then we s
2b7d0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20  hould.  ** only 
2b7e0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  generate code fo
2b7f0 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  r the first tabl
2b800 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e  e in pTabList an
2b810 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20  d assume that.  
2b820 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  ** any cursors a
2b830 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
2b840 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73  ubsequent tables
2b850 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   are uninitializ
2b860 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c  ed..  */.  nTabL
2b870 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67  ist = (wctrlFlag
2b880 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
2b890 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70  LE_ONLY) ? 1 : p
2b8a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
2b8b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
2b8c0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
2b8d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2b8e0 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
2b8f0 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
2b900 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
2b910 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
2b920 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2b930 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
2b940 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
2b950 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
2b960 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
2b970 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2b980 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
2b990 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
2b9a0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
2b9b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
2b9c0 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
2b9d0 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
2b9e0 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
2b9f0 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
2ba00 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
2ba10 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
2ba20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
2ba30 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
2ba40 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
2ba50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2ba60 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
2ba70 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
2ba80 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
2ba90 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
2baa0 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
2bab0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
2bac0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
2bad0 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20       nByteWInfo 
2bae0 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  + .      sizeof(
2baf0 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20  WhereClause) +. 
2bb00 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
2bb10 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20  eMaskSet).  );. 
2bb20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2bb30 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
2bb40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2bb50 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e  WInfo);.    pWIn
2bb60 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  fo = 0;.    goto
2bb70 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2bb80 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
2bb90 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
2bba0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  t;.  pWInfo->pPa
2bbb0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2bbc0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2bbd0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
2bbe0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
2bbf0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2bc00 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66  abel(v);.  pWInf
2bc10 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28  o->pWC = pWC = (
2bc20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28  WhereClause *)&(
2bc30 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42  (u8 *)pWInfo)[nB
2bc40 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49  yteWInfo];.  pWI
2bc50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2bc60 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
2bc70 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2bc80 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
2bc90 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
2bca0 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72  pMaskSet = (Wher
2bcb0 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31  eMaskSet*)&pWC[1
2bcc0 5d 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65  ];..  /* Disable
2bcd0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
2bce0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53 51  timization if SQ
2bcf0 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
2bd00 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a 2a   is set via.  **
2bd10 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 74   sqlite3_test_ct
2bd20 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  rl(SQLITE_TESTCT
2bd30 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
2bd40 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20 64  ,...) */.  if( d
2bd50 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2bd60 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 29 20  E_DistinctOpt ) 
2bd70 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a  pDistinct = 0;..
2bd80 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
2bd90 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
2bda0 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
2bdb0 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
2bdc0 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
2bdd0 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
2bde0 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
2bdf0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
2be00 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
2be10 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
2be20 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61  useInit(pWC, pPa
2be30 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 77  rse, pMaskSet, w
2be40 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73 71  ctrlFlags);.  sq
2be50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
2be60 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
2be70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53  Where);.  whereS
2be80 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65  plit(pWC, pWhere
2be90 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20  , TK_AND);   /* 
2bea0 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32  IMP: R-15842-532
2beb0 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20  96 */.    .  /* 
2bec0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20  Special case: a 
2bed0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2bee0 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t is constant.  
2bef0 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a  Evaluate the.  *
2bf00 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
2bf10 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65   either jump ove
2bf20 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64  r all of the cod
2bf30 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a  e or fall thru..
2bf40 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72    */.  if( pWher
2bf50 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  e && (nTabList==
2bf60 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
2bf70 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
2bf80 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
2bf90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2bfa0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
2bfb0 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
2bfc0 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
2bfd0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
2bfe0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
2bff0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
2c000 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
2c010 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
2c020 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c030 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
2c040 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
2c050 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
2c060 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
2c070 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
2c080 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
2c090 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
2c0a0 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
2c0b0 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
2c0c0 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
2c0d0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2c0e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2c0f0 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
2c100 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
2c110 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
2c120 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
2c130 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
2c140 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
2c150 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
2c160 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
2c170 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
2c180 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
2c190 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2c1a0 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
2c1b0 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
2c1c0 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
2c1d0 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
2c1e0 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
2c1f0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
2c200 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2c210 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
2c220 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
2c230 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
2c240 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2c250 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
2c260 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
2c270 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
2c280 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  ..  **.  ** Conf
2c290 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43  igure the WhereC
2c2a0 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69  lause.vmask vari
2c2b0 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74  able so that bit
2c2c0 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
2c2d0 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61  d.  ** to virtua
2c2e0 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20  l table cursors 
2c2f0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73  are set. This is
2c300 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69   used to selecti
2c310 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20  vely disable .  
2c320 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20  ** the OR-to-IN 
2c330 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
2c340 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  n exprAnalyzeOrT
2c350 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74  erm(). It is not
2c360 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77   helpful .  ** w
2c370 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
2c380 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  es..  **.  ** No
2c390 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73  te that bitmasks
2c3a0 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
2c3b0 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e   all pTabList->n
2c3c0 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20  Src tables in.  
2c3d0 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
2c3e0 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
2c3f0 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
2c400 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
2c410 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61  rmally.  ** equa
2c420 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
2c430 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
2c440 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
2c450 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52  if the.  ** WHER
2c460 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2c470 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a  flag is set..  *
2c480 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d  /.  assert( pWC-
2c490 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61  >vmask==0 && pMa
2c4a0 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  skSet->n==0 );. 
2c4b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2c4c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2c4d0 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
2c4e0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2c4f0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2c500 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
2c510 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2c520 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57  ABLE.    if( ALW
2c530 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  AYS(pTabList->a[
2c540 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
2c550 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
2c560 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[i].pTab) ){.  
2c570 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c      pWC->vmask |
2c580 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c  = ((Bitmask)1 <<
2c590 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
2c5a0 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  f.  }.#ifndef ND
2c5b0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
2c5c0 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
2c5d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2c5e0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2c5f0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  c; i++){.      B
2c600 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
2c610 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2c620 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2c630 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
2c640 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
2c650 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
2c660 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
2c670 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2c680 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
2c690 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
2c6a0 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
2c6b0 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
2c6c0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
2c6d0 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
2c6e0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
2c6f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2c700 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
2c710 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
2c720 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
2c730 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
2c740 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
2c750 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
2c760 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
2c770 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
2c780 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
2c790 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
2c7a0 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
2c7b0 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
2c7c0 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  , pWC);.  if( db
2c7d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2c7e0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
2c7f0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2c800 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2c810 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c  he DISTINCT qual
2c820 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20  ifier, if there 
2c830 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e  is one, is redun
2c840 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69  dant. .  ** If i
2c850 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70  t is, then set p
2c860 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c  Distinct to NULL
2c870 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65   and WhereInfo.e
2c880 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a  Distinct to.  **
2c890 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2c8a0 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74  UNIQUE to tell t
2c8b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e  he caller to ign
2c8c0 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ore the DISTINCT
2c8d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69  ..  */.  if( pDi
2c8e0 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74  stinct && isDist
2c8f0 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50  inctRedundant(pP
2c900 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2c910 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20  pWC, pDistinct) 
2c920 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74  ){.    pDistinct
2c930 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 0;.    pWInfo
2c940 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2c950 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2c960 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  QUE;.  }..  /* C
2c970 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
2c980 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
2c990 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
2c9a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
2c9b0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2c9c0 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
2c9d0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
2c9e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
2c9f0 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
2ca00 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
2ca10 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
2ca20 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
2ca30 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2ca40 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45  [].wsFlags   WHE
2ca50 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
2ca60 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
2ca70 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
2ca80 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
2ca90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
2caa0 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
2cab0 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
2cac0 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
2cad0 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68  Which term of th
2cae0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2caf0 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
2cb00 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2cb10 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
2cb20 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
2cb30 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
2cb40 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2cb50 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
2cb60 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
2cb70 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
2cb80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
2cb90 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73  Term     When ws
2cba0 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68  Flags==WO_OR, th
2cbb0 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d  e OR-clause term
2cbc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
2cbd0 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
2cbe0 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
2cbf0 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
2cc00 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
2cc10 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
2cc20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2cc30 69 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64 46  itmask)0;.  andF
2cc40 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
2cc50 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
2cc60 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
2cc70 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d  *\n"));.  for(i=
2cc80 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
2cc90 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61  pWInfo->a; i<nTa
2cca0 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76  bList; i++, pLev
2ccb0 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  el++){.    Where
2ccc0 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20  Cost bestPlan;  
2ccd0 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65         /* Most e
2cce0 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65  fficient plan se
2ccf0 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
2cd00 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74  Index for FROM t
2cd30 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d  able at pTabItem
2cd40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20   */.    int j;  
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd60 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2cd70 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62  ng over FROM tab
2cd80 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  les */.    int b
2cd90 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20  estJ = -1;      
2cda0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
2cdb0 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
2cdc0 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2cde0 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
2cdf0 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
2ce00 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c     int isOptimal
2ce10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2ce20 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f  * Iterator for o
2ce30 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d  ptimal/non-optim
2ce40 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  al search */.   
2ce50 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69   int nUnconstrai
2ce60 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ned;         /* 
2ce70 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69  Number tables wi
2ce80 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59  thout INDEXED BY
2ce90 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
2cea0 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20  notIndexed;     
2ceb0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
2cec0 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f  ables that canno
2ced0 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a  t use an index *
2cee0 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  /..    memset(&b
2cef0 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65  estPlan, 0, size
2cf00 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20  of(bestPlan));. 
2cf10 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73     bestPlan.rCos
2cf20 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
2cf30 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  BL;.    WHERETRA
2cf40 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73  CE(("*** Begin s
2cf50 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25  earch for loop %
2cf60 64 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a 0a  d ***\n", i));..
2cf70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
2cf80 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ugh the remainin
2cf90 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  g entries in the
2cfa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
2cfb0 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  find the.    ** 
2cfc0 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  next nested loop
2cfd0 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73  . The loop tests
2cfe0 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
2cff0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2d000 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74  either once or t
2d010 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  wice. .    **.  
2d020 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74    ** The first t
2d030 65 73 74 20 69 73 20 61 6c 77 61 79 73 20 70 65  est is always pe
2d040 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
2d050 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
2d060 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2d070 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65  remaining and ne
2d080 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ver performed if
2d090 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
2d0a0 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ne FROM clause e
2d0b0 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63  ntry.    ** to c
2d0c0 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65  hoose from.  The
2d0d0 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b   first test look
2d0e0 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61  s for an "optima
2d0f0 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20  l" scan.  In.   
2d100 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74   ** this context
2d110 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
2d120 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65   is one that use
2d130 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74  s the same strat
2d140 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  egy.    ** for t
2d150 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c  he given FROM cl
2d160 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f  ause entry as wo
2d170 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20  uld be selected 
2d180 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20  if the entry.   
2d190 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73   ** were used as
2d1a0 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e   the innermost n
2d1b0 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20  ested loop.  In 
2d1c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74  other words, a t
2d1d0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63  able.    ** is c
2d1e0 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20  hosen such that 
2d1f0 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e  the cost of runn
2d200 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63  ing that table c
2d210 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  annot be reduced
2d220 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69  .    ** by waiti
2d230 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62  ng for other tab
2d240 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74  les to run first
2d250 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c  .  This "optimal
2d260 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20  " test works.   
2d270 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73 73   ** by first ass
2d280 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 46  uming that the F
2d290 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e  ROM clause is on
2d2a0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
2d2b0 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20  and finding.    
2d2c0 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c 61  ** its query pla
2d2d0 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67  n, then checking
2d2e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 20   to see if that 
2d2f0 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20  query plan uses 
2d300 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  any.    ** other
2d310 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2d320 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 52  ms that are notR
2d330 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f 74  eady.  If no not
2d340 52 65 61 64 79 20 74 65 72 6d 73 20 61 72 65 0a  Ready terms are.
2d350 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65 6e      ** used then
2d360 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71   the "optimal" q
2d370 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e  uery plan works.
2d380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2d390 6f 74 65 20 74 68 61 74 20 74 68 65 20 57 68 65  ote that the Whe
2d3a0 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61  reCost.nRow para
2d3b0 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74  meter for an opt
2d3c0 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a  imal scan might.
2d3d0 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73      ** not be as
2d3e0 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75   small as it wou
2d3f0 6c 64 20 62 65 20 69 66 20 74 68 65 20 74 61 62  ld be if the tab
2d400 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74  le really were t
2d410 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20  he innermost.   
2d420 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e   ** join.  The n
2d430 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65  Row value can be
2d440 20 72 65 64 75 63 65 64 20 62 79 20 57 48 45 52   reduced by WHER
2d450 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
2d460 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ints.    ** that
2d470 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69   do not use indi
2d480 63 65 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e  ces.  But this n
2d490 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e  Row reduction on
2d4a0 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
2d4b0 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72  e.    ** table r
2d4c0 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e  eally is the inn
2d4d0 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20  ermost join.  . 
2d4e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2d4f0 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65   second loop ite
2d500 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70  ration is only p
2d510 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f  erformed if no o
2d520 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20  ptimal scan.    
2d530 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 77 65  ** strategies we
2d540 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20  re found by the 
2d550 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
2d560 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65   This second ite
2d570 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  ration.    ** is
2d580 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20   used to search 
2d590 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63  for the lowest c
2d5a0 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c  ost scan overall
2d5b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2d5c0 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
2d5d0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72 66  s of SQLite perf
2d5e0 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20 73  ormed only the s
2d5f0 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
2d600 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78  -.    ** the nex
2d610 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  t outermost loop
2d620 20 77 61 73 20 61 6c 77 61 79 73 20 74 68 61 74   was always that
2d630 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74   with the lowest
2d640 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20   overall.    ** 
2d650 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20 74  cost. However, t
2d660 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20 53  his meant that S
2d670 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c 65  QLite could sele
2d680 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c 61  ct the wrong pla
2d690 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63 72  n.    ** for scr
2d6a0 69 70 74 73 20 73 75 63 68 20 61 73 20 74 68 65  ipts such as the
2d6b0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
2d6c0 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 43  **   .    **   C
2d6d0 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
2d6e0 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20  , b); .    **   
2d6f0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
2d700 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20  c, d);.    **   
2d710 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2d720 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72 6f  , t1 WHERE t2.ro
2d730 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20  wid = t1.a;.    
2d740 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65  **.    ** The be
2d750 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20 74  st strategy is t
2d760 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2d770 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73 74  h table t1 first
2d780 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20 20  . However it.   
2d790 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
2d7a0 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
2d7b0 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69 6d   this with a sim
2d7c0 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f 72  ple greedy algor
2d7d0 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e  ithm..    ** Sin
2d7e0 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  ce the cost of a
2d7f0 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
2d800 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73  ough table t2 is
2d810 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a   the same .    *
2d820 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66  * as the cost of
2d830 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2d840 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c  hrough table t1,
2d850 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
2d860 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74   .    ** algorit
2d870 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f  hm may choose to
2d880 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20   use t2 for the 
2d890 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63  outer loop, whic
2d8a0 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20  h is a much.    
2d8b0 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72  ** costlier appr
2d8c0 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oach..    */.   
2d8d0 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20   nUnconstrained 
2d8e0 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65  = 0;.    notInde
2d8f0 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  xed = 0;.    for
2d900 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f  (isOptimal=(iFro
2d910 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20 69  m<nTabList-1); i
2d920 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62  sOptimal>=0 && b
2d930 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61  estJ<0; isOptima
2d940 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  l--){.      Bitm
2d950 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  ask mask;       
2d960 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2d970 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74 20   tables not yet 
2d980 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20 66  ready */.      f
2d990 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62  or(j=iFrom, pTab
2d9a0 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e  Item=&pTabList->
2d9b0 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74  a[j]; j<nTabList
2d9c0 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
2d9d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2d9e0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20  doNotReorder;   
2d9f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2da00 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f   table should no
2da10 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a  t be reordered *
2da20 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  /.        WhereC
2da30 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f  ost sCost;     /
2da40 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69  * Cost informati
2da50 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72  on from best[Vir
2da60 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a  tual]Index() */.
2da70 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2da80 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20   *pOrderBy;  /* 
2da90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2daa0 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74  for index to opt
2dab0 69 6d 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20  imize */.       
2dac0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
2dad0 3b 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e 43  ;     /* DISTINC
2dae0 54 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  T clause for ind
2daf0 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
2db00 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e  /.  .        doN
2db10 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54  otReorder =  (pT
2db20 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  abItem->jointype
2db30 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
2db40 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20  ROSS))!=0;.     
2db50 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20     if( j!=iFrom 
2db60 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
2db70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2db80 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
2db90 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
2dba0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2dbb0 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
2dbc0 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
2dbd0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
2dbe0 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
2dbf0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2dc00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dc10 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70      mask = (isOp
2dc20 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52  timal ? m : notR
2dc30 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70  eady);.        p
2dc40 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30  OrderBy = ((i==0
2dc50 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f   && ppOrderBy )?
2dc60 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20  *ppOrderBy:0);. 
2dc70 20 20 20 20 20 20 20 70 44 69 73 74 20 3d 20 28         pDist = (
2dc80 69 3d 3d 30 20 3f 20 70 44 69 73 74 69 6e 63 74  i==0 ? pDistinct
2dc90 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69   : 0);.        i
2dca0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  f( pTabItem->pIn
2dcb0 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73  dex==0 ) nUncons
2dcc0 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20  trained++;.  .  
2dcd0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
2dce0 28 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61  (("=== trying ta
2dcf0 62 6c 65 20 25 64 20 77 69 74 68 20 69 73 4f 70  ble %d with isOp
2dd00 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c  timal=%d ===\n",
2dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd20 20 20 20 20 20 6a 2c 20 69 73 4f 70 74 69 6d 61       j, isOptima
2dd30 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l));.        ass
2dd40 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70  ert( pTabItem->p
2dd50 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  Tab );.#ifndef S
2dd60 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2dd70 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2dd80 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
2dd90 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  abItem->pTab) ){
2dda0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2ddb0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
2ddc0 70 70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  pp = &pWInfo->a[
2ddd0 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
2dde0 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75         bestVirtu
2ddf0 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  alIndex(pParse, 
2de00 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d  pWC, pTabItem, m
2de10 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  ask, notReady, p
2de20 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de40 20 20 20 20 26 73 43 6f 73 74 2c 20 70 70 29 3b      &sCost, pp);
2de50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  .        }else .
2de60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2de70 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42  .          bestB
2de80 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65  treeIndex(pParse
2de90 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
2dea0 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c   mask, notReady,
2deb0 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
2dec0 20 20 20 20 20 20 20 20 20 70 44 69 73 74 2c 20           pDist, 
2ded0 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  &sCost);.       
2dee0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2def0 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20  t( isOptimal || 
2df00 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52  (sCost.used&notR
2df10 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  eady)==0 );..   
2df20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e       /* If an IN
2df30 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
2df40 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
2df50 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20 75   the plan must u
2df60 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  se that.        
2df70 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20 75  ** index if it u
2df80 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61 74  ses any index at
2df90 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20   all */.        
2dfa0 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
2dfb0 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20  ->pIndex==0 .   
2dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2dfd0 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73  | (sCost.plan.ws
2dfe0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2dff0 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e010 20 7c 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75   || sCost.plan.u
2e020 2e 70 49 64 78 3d 3d 70 54 61 62 49 74 65 6d 2d  .pIdx==pTabItem-
2e030 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20  >pIndex );..    
2e040 20 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61      if( isOptima
2e050 6c 20 26 26 20 28 73 43 6f 73 74 2e 70 6c 61 6e  l && (sCost.plan
2e060 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2e070 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
2e080 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
2e090 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a  otIndexed |= m;.
2e0a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2e0b0 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73     /* Conditions
2e0c0 20 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69   under which thi
2e0d0 73 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20  s table becomes 
2e0e0 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a  the best so far:
2e0f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e100 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65      **   (1) The
2e110 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20   table must not 
2e120 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20  depend on other 
2e130 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65  tables that have
2e140 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
2e150 20 20 20 20 20 20 79 65 74 20 72 75 6e 2e 0a 20        yet run.. 
2e160 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e170 20 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c    **   (2) A ful
2e180 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61  l-table-scan pla
2e190 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65  n cannot superce
2e1a0 64 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20  de indexed plan 
2e1b0 75 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a  unless.        *
2e1c0 2a 20 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c  *       the full
2e1d0 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61  -table-scan is a
2e1e0 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e  n "optimal" plan
2e1f0 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76   as defined abov
2e200 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
2e210 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41        **   (3) A
2e220 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61  ll tables have a
2e230 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2e240 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c  use or this tabl
2e250 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20  e lacks an.     
2e260 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45     **       INDE
2e270 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72  XED BY clause or
2e280 20 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73   this table uses
2e290 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20   the specific.  
2e2a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69        **       i
2e2b0 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62  ndex specified b
2e2c0 79 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59  y its INDEXED BY
2e2d0 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72   clause.  This r
2e2e0 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20  ule ensures.    
2e2f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61      **       tha
2e300 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  t a best-so-far 
2e310 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74  is always select
2e320 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d  ed even if an im
2e330 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2e340 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e   **       combin
2e350 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44  ation of INDEXED
2e360 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
2e370 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f  given.  The erro
2e380 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  r.        **    
2e390 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63     will be detec
2e3a0 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20  ted and relayed 
2e3b0 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c  back to the appl
2e3c0 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20  ication later.. 
2e3d0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2e3e0 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65  The NEVER() come
2e3f0 73 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20  s about because 
2e400 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70  rule (2) above p
2e410 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
2e420 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65  **       An inde
2e430 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65  xable full-table
2e440 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68  -scan from reach
2e450 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20  ing rule (3)..  
2e460 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e470 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c   **   (4) The pl
2e480 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20  an cost must be 
2e490 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72  lower than prior
2e4a0 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20 74   plans or else t
2e4b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  he.        **   
2e4c0 20 20 20 20 63 6f 73 74 20 6d 75 73 74 20 62 65      cost must be
2e4d0 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20 74 68   the same and th
2e4e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2e4f0 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 2e 0a   must be lower..
2e500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e510 20 20 20 69 66 28 20 28 73 43 6f 73 74 2e 75 73     if( (sCost.us
2e520 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20  ed&notReady)==0 
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e540 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
2e550 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2e560 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49  bestJ<0 || (notI
2e570 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20  ndexed&m)!=0    
2e580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2e590 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2e5a0 20 20 20 20 20 7c 7c 20 28 62 65 73 74 50 6c 61       || (bestPla
2e5b0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2e5c0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2e5d0 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  CAN)==0.        
2e5e0 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73          || (sCos
2e5f0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2e600 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2e610 43 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20  CAN)!=0).       
2e620 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73       && (nUncons
2e630 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54  trained==0 || pT
2e640 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d  abItem->pIndex==
2e650 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20  0   /* (3) */.  
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2e670 20 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c   NEVER((sCost.pl
2e680 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2e690 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
2e6a0 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  !=0)).          
2e6b0 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c    && (bestJ<0 ||
2e6c0 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73   sCost.rCost<bes
2e6d0 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20  tPlan.rCost     
2e6e0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
2e6f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
2e700 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74  Cost.rCost<=best
2e710 50 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20  Plan.rCost .    
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2e730 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c  sCost.plan.nRow<
2e740 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2e750 6f 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow)).        ){.
2e760 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
2e770 52 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65  RACE(("=== table
2e780 20 25 64 20 69 73 20 62 65 73 74 20 73 6f 20 66   %d is best so f
2e790 61 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar".            
2e7a0 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
2e7b0 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f   cost=%g and nRo
2e7c0 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w=%g\n",.       
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
2e7e0 2c 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73  , sCost.rCost, s
2e7f0 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29  Cost.plan.nRow))
2e800 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
2e810 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20  Plan = sCost;.  
2e820 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
2e830 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
2e840 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65       if( doNotRe
2e850 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
2e860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e870 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d   assert( bestJ>=
2e880 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e890 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d   notReady & getM
2e8a0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2e8b0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
2e8c0 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  .iCursor) );.   
2e8d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2e8e0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65  * Optimizer sele
2e8f0 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72  cts table %d for
2e900 20 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20   loop %d".      
2e910 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
2e920 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f   cost=%g and nRo
2e930 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w=%g\n",.       
2e940 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20           bestJ, 
2e950 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
2e960 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  , bestPlan.rCost
2e970 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  , bestPlan.plan.
2e980 6e 52 6f 77 29 29 3b 0a 20 20 20 20 2f 2a 20 54  nRow));.    /* T
2e990 68 65 20 41 4c 57 41 59 53 28 29 20 74 68 61 74  he ALWAYS() that
2e9a0 20 66 6f 6c 6c 6f 77 73 20 77 61 73 20 61 64 64   follows was add
2e9b0 65 64 20 74 6f 20 68 75 73 68 20 75 70 20 63 6c  ed to hush up cl
2e9c0 61 6e 67 20 73 63 61 6e 2d 62 75 69 6c 64 20 2a  ang scan-build *
2e9d0 2f 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50  /.    if( (bestP
2e9e0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2e9f0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
2ea00 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 70  )!=0 && ALWAYS(p
2ea10 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20 20  pOrderBy) ){.   
2ea20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
2ea30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2ea40 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
2ea50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ea60 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a  DISTINCT)!=0 ){.
2ea70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
2ea80 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2ea90 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
2eaa0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2eab0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2eac0 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
2ead0 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
2eae0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
2eaf0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
2eb00 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e  >plan = bestPlan
2eb10 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63  .plan;.    testc
2eb20 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
2eb30 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2eb40 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
2eb50 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
2eb60 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2eb70 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2eb80 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20  NDEX );.    if( 
2eb90 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2eba0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
2ebb0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d  NDEXED|WHERE_TEM
2ebc0 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  P_INDEX) ){.    
2ebd0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
2ebe0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2ebf0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
2ec00 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2ec10 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
2ec20 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
2ec30 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
2ec40 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2ec50 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
2ec60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
2ec70 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
2ec80 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2ec90 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
2eca0 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
2ecb0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2ecc0 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
2ecd0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
2ece0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2ecf0 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
2ed00 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
2ed10 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
2ed20 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
2ed30 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
2ed40 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
2ed50 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
2ed60 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
2ed70 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
2ed80 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
2ed90 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
2eda0 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
2edb0 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
2edc0 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
2edd0 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
2ede0 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
2edf0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
2ee00 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
2ee10 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
2ee20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2ee30 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
2ee40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ee50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2ee60 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
2ee70 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
2ee80 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
2ee90 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2eea0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2eeb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
2eec0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2eed0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
2eee0 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
2eef0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
2ef00 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2ef10 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
2ef20 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
2ef30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2ef40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
2ef50 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
2ef60 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
2ef70 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
2ef80 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
2ef90 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
2efa0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
2efb0 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2efc0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
2efd0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
2efe0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2eff0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2f000 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
2f010 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2f020 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2f030 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
2f040 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
2f050 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
2f060 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
2f070 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
2f080 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
2f090 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
2f0a0 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
2f0b0 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
2f0c0 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
2f0d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f0e0 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
2f0f0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2f100 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
2f110 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
2f120 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
2f130 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
2f140 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
2f150 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
2f160 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
2f170 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
2f180 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
2f190 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
2f1a0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
2f1b0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
2f1c0 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
2f1d0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
2f1e0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2f1f0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2f200 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2f210 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2f220 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2f230 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2f240 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2f250 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  && (andFlags & W
2f260 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
2f270 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
2f280 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
2f290 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
2f2a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
2f2b0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
2f2c0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2f2d0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2f2e0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
2f2f0 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
2f300 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
2f310 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
2f320 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
2f330 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2f340 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
2f350 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
2f360 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
2f370 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  to */.  notReady
2f380 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2f390 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2f3a0 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
2f3b0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
2f3c0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
2f3d0 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
2f3e0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
2f3f0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
2f400 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
2f410 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
2f420 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2f430 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
2f440 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
2f450 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  x */..    pTabIt
2f460 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2f470 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2f480 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
2f490 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2f4a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2f4b0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2f4c0 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  rsor;.    pWInfo
2f4d0 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65  ->nRowOut *= pLe
2f4e0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
2f4f0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2f500 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2f510 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2f520 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2f530 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2f540 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
2f550 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
2f560 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
2f570 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
2f580 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
2f590 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2f5a0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
2f5b0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2f5c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2f5d0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
2f5e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2f5f0 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
2f600 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
2f610 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
2f620 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
2f630 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2f640 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
2f650 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2f660 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
2f670 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
2f680 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
2f690 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2f6a0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2f6b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2f6c0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
2f6d0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2f6e0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
2f6f0 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 20  _OPEN_CLOSE)==0 
2f700 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
2f710 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
2f720 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
2f730 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
2f740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
2f750 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
2f760 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2f770 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
2f780 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  p);.      testca
2f790 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
2f7a0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
2f7b0 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
2f7c0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
2f7d0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
2f7e0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
2f7f0 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
2f800 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
2f810 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
2f820 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
2f830 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
2f840 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
2f850 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
2f860 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f870 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
2f880 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f890 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8b0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2f8c0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
2f8d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f8e0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
2f8f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f900 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2f910 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2f920 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2f930 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2f940 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Name);.    }.#if
2f950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f960 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2f970 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2f980 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2f990 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
2f9a0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
2f9b0 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
2f9c0 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  cIndex(pParse, p
2f9d0 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
2f9e0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2f9f0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2fa00 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
2fa10 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2fa20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2fa30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  !=0 ){.      Ind
2fa40 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c  ex *pIx = pLevel
2fa50 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
2fa60 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2fa70 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
2fa80 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
2fa90 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74   pIx);.      int
2faa0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
2fab0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
2fac0 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
2fad0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
2fae0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
2faf0 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d  ssert( iIdxCur>=
2fb00 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
2fb10 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2fb20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
2fb30 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
2fb40 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2fb60 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
2fb70 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
2fb80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fb90 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
2fba0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
2fbb0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2fbc0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2fbd0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f  se, iDb);.    no
2fbe0 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
2fbf0 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
2fc00 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2fc10 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
2fc20 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2fc30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2fc40 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2fc50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2fc60 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2fc70 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2fc80 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2fc90 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2fca0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2fcb0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2fcc0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2fcd0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2fce0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2fcf0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2fd00 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2fd10 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2fd20 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2fd30 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  =0; i<nTabList; 
2fd40 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
2fd50 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2fd60 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  ;.    explainOne
2fd70 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
2fd80 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
2fd90 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
2fda0 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
2fdb0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
2fdc0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
2fdd0 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c  Info, i, wctrlFl
2fde0 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  ags, notReady, p
2fdf0 57 68 65 72 65 29 3b 0a 20 20 20 20 70 57 49 6e  Where);.    pWIn
2fe00 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
2fe10 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2fe20 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
2fe30 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
2fe40 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
2fe50 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
2fe60 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
2fe70 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
2fe80 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
2fe90 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
2fea0 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
2feb0 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
2fec0 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
2fed0 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
2fee0 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
2fef0 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
2ff00 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
2ff10 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
2ff20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
2ff30 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
2ff40 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
2ff50 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
2ff60 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
2ff70 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
2ff80 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2ff90 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2ffa0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
2ffb0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
2ffc0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2ffd0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62  ->a[i];.    pTab
2ffe0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2fff0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
30000 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62  m];.    z = pTab
30010 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
30020 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
30030 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
30040 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20  >zName;.    n = 
30050 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
30060 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51  z);.    if( n+nQ
30070 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
30080 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
30090 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )-10 ){.      if
300a0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
300b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
300c0 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
300d0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
300e0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
300f0 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
30100 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
30110 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
30120 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
30130 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
30140 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
30150 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
30160 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
30170 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
30180 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
30190 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
301a0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
301b0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
301c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
301d0 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65  WID_EQ );.    te
301e0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
301f0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
30200 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
30210 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
30220 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30230 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
30240 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
30250 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d  ANGE) ){.      m
30260 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
30270 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
30280 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20  ], "* ", 2);.   
30290 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
302a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
302b0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
302c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
302d0 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
302e0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
302f0 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  en30(pLevel->pla
30300 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  n.u.pIdx->zName)
30310 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
30320 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
30330 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
30340 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  )-2 ){.        m
30350 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
30360 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
30370 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ], pLevel->plan.
30380 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e  u.pIdx->zName, n
30390 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
303a0 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  n += n;.        
303b0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
303c0 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
303d0 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ';.      }.    
303e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
303f0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
30400 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
30410 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20   "{} ", 3);.    
30420 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
30430 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65     }.  }.  while
30440 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71  ( nQPlan>0 && sq
30450 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
30460 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20  [nQPlan-1]==' ' 
30470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71  ){.    sqlite3_q
30480 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c  uery_plan[--nQPl
30490 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  an] = 0;.  }.  s
304a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
304b0 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  n[nQPlan] = 0;. 
304c0 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e   nQPlan = 0;.#en
304d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
304e0 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e  ST // Testing an
304f0 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
30500 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  only */..  /* Re
30510 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75  cord the continu
30520 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e  ation address in
30530 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
30540 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a  tructure.  Then.
30550 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e    ** clean up an
30560 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
30570 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
30580 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
30590 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
305a0 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
305b0 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  or:.  if( pWInfo
305c0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
305d0 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
305e0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
305f0 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65 49  Loop;.    whereI
30600 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
30610 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
30620 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
30630 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
30640 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
30650 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
30660 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
30670 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
30680 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
30690 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
306a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
306b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
306c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
306d0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
306e0 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
306f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
30700 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
30710 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
30720 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
30730 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
30740 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
30750 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
30760 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
30770 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
30780 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
30790 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
307a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
307b0 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e   for(i=pWInfo->n
307c0 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  Level-1; i>=0; i
307d0 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
307e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
307f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30800 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30810 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
30820 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
30830 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
30840 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
30850 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
30860 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
30870 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
30880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30890 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
308a0 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
308b0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
308c0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
308d0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
308e0 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
308f0 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
30900 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
30910 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
30920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30930 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
30940 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
30950 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
30960 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
30970 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
30980 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
30990 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
309a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
309b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
309c0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
309d0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
309e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
309f0 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69   OP_Next, pIn->i
30a00 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
30a10 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Top);.        sq
30a20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30a30 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
30a40 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
30a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
30a60 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
30a70 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
30a80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30a90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
30aa0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
30ab0 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
30ac0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
30ad0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
30ae0 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
30af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30b00 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
30b10 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
30b20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30b30 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
30b40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
30b50 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
30b60 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76 65         || (pLeve
30b70 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
30b80 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
30b90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
30ba0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
30bb0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
30bc0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
30bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30be0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
30bf0 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
30c00 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
30c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30c20 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  f( pLevel->iIdxC
30c30 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ur>=0 ){.       
30c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30c50 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
30c60 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
30c70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30c80 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
30c90 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
30ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
30cc0 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
30cd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
30ce0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
30cf0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
30d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30d10 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
30d20 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30d40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
30d50 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
30d60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
30d70 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
30d80 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
30d90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30da0 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
30db0 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
30dc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30dd0 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
30de0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
30df0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
30e00 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
30e10 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
30e20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30e30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30e40 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
30e50 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =1 || pWInfo->nL
30e60 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  evel==pTabList->
30e70 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
30e80 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
30e90 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
30ea0 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
30eb0 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63  el++){.    struc
30ec0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30ed0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
30ee0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
30ef0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
30f00 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
30f10 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
30f20 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
30f30 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
30f40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
30f50 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20  hemeral)==0.    
30f60 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
30f70 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57  t==0.     && (pW
30f80 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
30f90 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50   & WHERE_OMIT_OP
30fa0 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20  EN_CLOSE)==0.   
30fb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73   ){.      int ws
30fc0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
30fd0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  wsFlags;.      i
30fe0 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
30ff0 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20 57  ePass && (ws & W
31000 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
31010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
31020 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31030 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
31040 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
31050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31060 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e  ( (ws & WHERE_IN
31070 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77 73  DEXED)!=0 && (ws
31080 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
31090 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)==0 ){.     
310a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
310b0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
310c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
310d0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
310e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
310f0 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
31100 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
31110 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
31120 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
31130 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
31140 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
31150 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
31160 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
31170 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
31180 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
31190 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
311a0 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
311b0 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
311c0 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
311d0 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
311e0 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
311f0 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
31200 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
31210 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
31220 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
31230 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
31240 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
31250 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
31260 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
31270 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
31280 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
31290 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
312a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
312b0 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
312c0 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
312d0 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
312e0 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
312f0 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
31300 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
31310 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
31320 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
31330 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
31340 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
31350 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
31360 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
31370 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
31380 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
31390 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
313a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
313b0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
313c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
313d0 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21 64  NDEXED)!=0 && !d
313e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
313f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
31400 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
31410 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
31420 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
31430 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
31440 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  dx;..      asser
31450 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
31460 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
31470 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57  3VdbeGetOp(v, pW
31480 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20  Info->iTop);.   
31490 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
314a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
314b0 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  (v);.      for(k
314c0 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b  =pWInfo->iTop; k
314d0 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b  <last; k++, pOp+
314e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
314f0 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d  pOp->p1!=pLevel-
31500 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69  >iTabCur ) conti
31510 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
31520 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
31530 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
31540 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
31550 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
31560 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
31570 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
31580 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
31590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
315a0 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
315b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
315c0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
315d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
315e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
315f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31610 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d  assert( (pLevel-
31620 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
31630 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
31640 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
31650 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f    || j<pIdx->nCo
31660 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
31670 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
31680 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
31690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
316a0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
316b0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
316c0 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
316d0 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
316e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
316f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
31700 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
31710 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  /.  pParse->nQue
31720 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
31730 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
31740 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  ;.  whereInfoFre
31750 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
31760 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.