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

Artifact 6baab5dfcf4472552c0346d04f6fd2f4f8539c78:


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 20 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 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
23090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
230a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
230b0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
230c0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
230d0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
230e0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
230f0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
23100 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
23110 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
23120 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
23130 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
23140 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
23150 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
23160 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
23170 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
23180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23190 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
231a0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
231b0 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
231c0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
231d0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
231e0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
231f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
23200 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
23210 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
23220 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
23230 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
23240 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
23250 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
23260 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
23270 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
23280 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23290 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
232a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
232b0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
232c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
232d0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
232e0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
232f0 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
23300 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23310 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
23320 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
23330 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
23340 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23360 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
23370 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
23380 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
23390 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
233a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
233b0 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
233c0 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
233d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
233e0 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
233f0 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
23400 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
23410 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
23420 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
23430 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
23440 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
23450 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
23460 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
23470 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
23480 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
23490 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
234a0 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e    pWC = pWInfo->
234b0 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  pWC;.  pLevel = 
234c0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
234d0 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  l];.  pTabItem =
234e0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
234f0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
23500 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
23510 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
23520 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76  ;.  bRev = (pLev
23530 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
23540 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
23550 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  )!=0;.  omitTabl
23560 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  e = (pLevel->pla
23570 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
23580 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
23590 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
235a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
235b0 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
235c0 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  0;..  /* Create 
235d0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
235e0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
235f0 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
23600 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
23610 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
23620 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
23630 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
23640 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
23650 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
23660 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
23670 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
23680 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
23690 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
236a0 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
236b0 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
236c0 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
236d0 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
236e0 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
236f0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
23700 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
23710 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
23720 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
23730 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
23740 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
23750 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
23760 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
23770 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
23780 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
23790 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
237a0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
237b0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
237c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
237d0 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
237e0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
237f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
23800 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
23810 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
23820 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
23830 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
23840 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
23850 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
23860 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
23870 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
23880 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
23890 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
238a0 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
238b0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
238c0 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
238d0 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
238e0 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
238f0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
23900 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
23910 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
23920 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
23930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23940 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23950 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
23960 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
23970 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
23980 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
23990 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
239a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
239b0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
239c0 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65  LE.  if(  (pLeve
239d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
239e0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
239f0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
23a00 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
23a10 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
23a20 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
23a30 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
23a40 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
23a50 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
23a60 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
23a70 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
23a80 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
23a90 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
23aa0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
23ab0 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
23ac0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
23ad0 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e  pVtabIdx;.    in
23ae0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
23af0 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74  pVtabIdx->nConst
23b00 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  raint;.    struc
23b10 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
23b20 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
23b30 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
23b70 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
23b80 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Usage;.    const
23b90 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
23ba0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
23bb0 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
23c00 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69  raint;..    sqli
23c10 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
23c20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
23c30 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
23c40 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
23c50 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
23c60 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
23c70 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  =nConstraint; j+
23c80 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  +){.      for(k=
23c90 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; k<nConstraint
23ca0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
23cb0 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72  if( aUsage[k].ar
23cc0 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20  gvIndex==j ){.  
23cd0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
23ce0 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
23cf0 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
23d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23d10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
23d20 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  , pWC->a[iTerm].
23d30 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
23d40 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20  Reg+j+1);.      
23d50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23d60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23d70 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
23d80 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
23d90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23db0 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49  _Integer, pVtabI
23dc0 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67  dx->idxNum, iReg
23dd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
23de0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
23df0 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65  nteger, j-1, iRe
23e00 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
23e10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
23e20 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
23e30 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20   addrBrk, iReg, 
23e40 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
23e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23e60 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
23e70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
23e80 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  tr ? P4_MPRINTF 
23e90 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
23ea0 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
23eb0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
23ec0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
23ed0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
23ee0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55  +){.      if( aU
23ef0 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
23f00 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
23f10 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
23f20 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  j].iTermOffset;.
23f30 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
23f40 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43  erm(pLevel, &pWC
23f50 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  ->a[iTerm]);.   
23f60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
23f70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
23f80 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
23f90 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
23fa0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
23fb0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23fc0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
23fd0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23fe0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
23ff0 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
24000 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
24010 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
24020 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
24030 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24040 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
24050 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76  E */..  if( pLev
24060 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24070 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
24080 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  Q ){.    /* Case
24090 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
240a0 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
240b0 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
240c0 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
240d0 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
240e0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
240f0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
24100 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
24110 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
24120 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
24130 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
24140 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
24150 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
24160 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
24170 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
24180 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24190 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
241a0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
241b0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
241c0 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
241d0 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  IN, 0);.    asse
241e0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
241f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
24200 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
24210 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
24220 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
24230 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ur );.    assert
24240 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
24250 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24260 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24270 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
24280 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
24290 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f  11662 */.    iRo
242a0 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
242b0 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
242c0 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
242d0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
242e0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
242f0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
24300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24310 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
24320 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
24330 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
24340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24350 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
24360 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
24370 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
24380 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24390 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
243a0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
243b0 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
243c0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
243d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
243e0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
243f0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
24400 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
24410 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
24420 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
24430 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
24440 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
24450 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
24460 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
24470 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
24480 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
24490 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
244a0 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
244b0 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
244c0 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
244d0 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
244e0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
244f0 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
24500 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
24510 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
24520 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
24530 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
24540 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
24550 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
24560 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
24570 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
24580 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
24590 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
245a0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
245b0 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
245c0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
245d0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
245e0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
245f0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
24600 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
24610 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
24620 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
24630 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
24640 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
24650 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
24660 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
24670 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
24680 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
24690 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
246a0 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
246b0 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
246c0 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
246d0 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
246e0 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
246f0 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
24700 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
24710 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
24720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
24730 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74  GT */  OP_SeekGt
24740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
24750 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
24760 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLe,.           
24770 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
24780 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20  SeekLt,.        
24790 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
247a0 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20  OP_SeekGe.      
247b0 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
247c0 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
247d0 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
247e0 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
247f0 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
24800 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
24810 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
24820 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
24830 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
24840 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
24850 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
24860 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
24870 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
24880 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
24890 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
248a0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
248b0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
248c0 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d  62 */.      pX =
248d0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
248e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
248f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
24900 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
24910 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
24920 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
24930 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24940 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
24950 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
24960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24970 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
24980 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
24990 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
249a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
249b0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
249c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
249d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
249e0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
249f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
24a00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
24a10 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
24a20 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
24a30 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
24a40 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
24a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24a60 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
24a70 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
24a80 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
24a90 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rBrk);.    }.   
24aa0 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
24ab0 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
24ac0 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
24ad0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
24ae0 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
24af0 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
24b00 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
24b10 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
24b20 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
24b30 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24b40 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
24b50 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
24b60 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20    memEndValue = 
24b70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24b90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
24ba0 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64  ->pRight, memEnd
24bb0 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
24bc0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
24bd0 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
24be0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
24bf0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
24c00 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
24c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24c20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
24c30 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
24c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73       }.      dis
24c50 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
24c60 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pEnd);.    }.  
24c70 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
24c80 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
24c90 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  (v);.    pLevel-
24ca0 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
24cb0 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
24cc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
24cd0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
24ce0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
24cf0 20 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30     if( pStart==0
24d00 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20   && pEnd==0 ){. 
24d10 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
24d20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
24d30 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
24d40 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
24d50 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
24d60 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
24d70 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f   }.    if( testO
24d80 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
24d90 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
24da0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
24db0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24dc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
24dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24de0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
24df0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
24e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24e10 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
24e20 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
24e30 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
24e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e50 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
24e60 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
24e70 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
24e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24e90 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
24ea0 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
24eb0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
24ec0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
24ed0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
24ee0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
24ef0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
24f00 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  E|WHERE_COLUMN_E
24f10 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  Q) ){.    /* Cas
24f20 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 3: A scan usin
24f30 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
24f40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
24f50 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
24f60 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
24f70 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
24f80 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
24f90 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
24fa0 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
24fb0 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
24fc0 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
24fd0 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
24fe0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
24ff0 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
25000 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
25010 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
25020 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
25030 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
25040 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
25050 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25060 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
25070 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
25080 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
25090 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
250a0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
250b0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
250c0 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
250d0 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
250e0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
250f0 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
25100 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
25110 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
25120 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
25130 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
25140 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
25150 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
25160 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
25170 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
25180 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
25190 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
251a0 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
251b0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
251c0 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
251d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
251e0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
251f0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
25200 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
25210 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
25220 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
25230 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
25240 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
25250 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
25260 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
25270 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
25280 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
25290 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
252a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
252b0 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
252c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
252d0 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
252e0 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
252f0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
25300 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
25310 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
25320 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
25330 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
25340 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
25350 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
25360 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
25370 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
25380 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
25390 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
253a0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
253b0 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
253c0 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
253d0 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
253e0 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
253f0 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
25400 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
25410 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
25420 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
25430 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
25440 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
25450 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
25460 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
25470 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
25480 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
25490 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
254a0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
254b0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
254c0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
254d0 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
254e0 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
254f0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
25500 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
25510 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
25520 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20  eekGt,          
25530 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
25540 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
25550 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
25560 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
25570 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLt,           /
25580 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
25590 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
255a0 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
255b0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
255c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
255d0 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
255e0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
255f0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
25600 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20        OP_SeekLe 
25610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
25620 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
25630 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
25640 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
25650 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
25660 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
25670 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e  ] = {.      OP_N
25680 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
25690 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e   /* 0: (!end_con
256a0 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20  straints) */.   
256b0 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
256c0 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
256d0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
256e0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
256f0 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
25700 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
25710 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
25720 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
25730 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  .    int nEq = p
25740 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b  Level->plan.nEq;
25750 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
25760 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
25770 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
25780 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
25790 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
257a0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
257b0 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a  ECT min(x).. */.
257c0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
257f0 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
25800 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
25810 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20     int r1;      
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
25840 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
25850 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
25860 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
25870 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
25880 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
25890 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
258a0 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
258b0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
258c0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
258d0 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
258e0 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
258f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25900 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
25910 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
25920 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
25930 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
25940 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25950 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
25960 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
25970 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
25980 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
25990 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
259a0 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
259b0 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
259c0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
259d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
259e0 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
259f0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
25a00 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
25a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25a20 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
25a30 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
25a40 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
25a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25a60 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
25a70 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
25a80 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
25a90 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
25aa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
25ab0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
25ac0 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
25ad0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
25ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
25af0 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
25b00 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
25b10 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
25b20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
25b30 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
25b40 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
25b50 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66      char *zEndAf
25b60 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
25b70 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
25b80 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
25b90 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20  nstraint */..   
25ba0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
25bb0 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
25bc0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
25bd0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
25be0 6b 20 3d 20 28 6e 45 71 3d 3d 70 49 64 78 2d 3e  k = (nEq==pIdx->
25bf0 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a 20 70  nColumn ? -1 : p
25c00 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
25c10 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  q]);..    /* If 
25c20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
25c30 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
25c40 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
25c50 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
25c60 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
25c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
25c80 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
25c90 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
25ca0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
25cb0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
25cc0 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
25cd0 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
25ce0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
25cf0 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
25d00 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
25d10 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
25d20 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
25d30 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
25d40 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
25d50 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
25d60 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
25d70 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
25d80 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
25d90 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
25da0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
25db0 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
25dc0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
25dd0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
25de0 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c  /.    if( (wctrl
25df0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
25e00 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
25e10 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   && (pLevel->pla
25e20 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
25e30 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26  ORDERBY).     &&
25e40 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e   (pIdx->nColumn>
25e50 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
25e60 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
25e70 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20  derBy->nExpr==1 
25e80 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61  ); */.      /* a
25e90 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
25ea0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
25eb0 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
25ec0 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a  lumn[nEq] ); */.
25ed0 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79        isMinQuery
25ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
25ef0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
25f00 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
25f10 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
25f20 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
25f30 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
25f40 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
25f50 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
25f60 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
25f70 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
25f80 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
25f90 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
25fa0 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  End = findTerm(p
25fb0 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
25fc0 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f  Ready, (WO_LT|WO
25fd0 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _LE), pIdx);.   
25fe0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
25ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26000 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
26010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
26020 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
26030 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69  pRangeStart = fi
26040 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
26050 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28  , k, notReady, (
26060 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49  WO_GT|WO_GE), pI
26070 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  dx);.      nExtr
26080 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
26090 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
260a0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
260b0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
260c0 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
260d0 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64  or IN.    ** and
260e0 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
260f0 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
26100 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
26110 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
26120 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
26130 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Base..    */.   
26140 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
26150 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
26160 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
26170 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f   pLevel, pWC, no
26180 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65  tReady, nExtraRe
26190 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20  g, &zStartAff.  
261a0 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66    );.    zEndAff
261b0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
261c0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  up(pParse->db, z
261d0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
261e0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
261f0 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f  >addrNxt;..    /
26200 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
26210 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
26220 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
26230 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
26240 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
26250 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
26260 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
26270 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
26280 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
26290 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
262a0 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
262b0 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
262c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 45 71   */.    if( (nEq
262d0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pIdx->nColumn &
262e0 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  & bRev==(pIdx->a
262f0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
26300 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 29 0a  SQLITE_SO_ASC)).
26310 20 20 20 20 20 7c 7c 20 28 62 52 65 76 20 26 26       || (bRev &&
26320 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d   pIdx->nColumn==
26330 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
26340 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
26350 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
26360 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
26370 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
26380 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
26390 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
263a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
263b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
263c0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
263d0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
263e0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
263f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26400 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
26410 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
26420 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
26430 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
26440 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
26450 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
26460 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72  O_GE );.    star
26470 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
26480 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
26490 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
264a0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
264b0 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
264c0 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
264d0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
264e0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
264f0 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
26500 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
26510 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
26520 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
26530 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
26540 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
26550 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
26560 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
26570 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
26580 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
26590 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
265a0 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d  ngeStart->pExpr-
265b0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
265c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
265d0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
265e0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
265f0 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74     if( (pRangeSt
26600 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
26610 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
26620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26630 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
26640 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
26650 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
26660 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
26670 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
26680 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26690 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
266a0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
266b0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
266c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
266d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
266e0 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
266f0 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
26700 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
26710 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
26720 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
26730 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
26740 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
26750 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
26760 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
26770 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
26780 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
26790 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
267a0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
267b0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
267c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
267d0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
267e0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
267f0 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
26800 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
26810 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
26820 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
26830 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
26840 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
26850 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
26860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
26870 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
26880 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
26890 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
268a0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
268b0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
268c0 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
268d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
268e0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
268f0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
26900 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
26910 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
26920 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
26930 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
26940 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
26950 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
26960 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
26970 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74  nConstraint, zSt
26980 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
26990 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
269a0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
269b0 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
269c0 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
269d0 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
269e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
269f0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
26a00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26a10 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
26a20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26a30 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
26a40 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
26a50 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
26a60 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
26a70 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
26a80 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
26a90 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
26aa0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
26ab0 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
26ac0 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
26ad0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
26ae0 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
26af0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
26b00 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
26b10 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
26b20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
26b30 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
26b40 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
26b50 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
26b60 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
26b70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
26b80 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
26b90 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
26ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26bb0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
26bc0 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
26bd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
26be0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
26bf0 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
26c00 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
26c10 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
26c20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
26c30 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
26c40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26c50 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
26c60 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
26c70 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
26c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26c90 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
26ca0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26cb0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
26cc0 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
26cd0 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
26ce0 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
26cf0 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
26d00 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
26d10 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
26d20 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
26d30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
26d40 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
26d50 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
26d60 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
26d70 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
26d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
26d90 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
26da0 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
26db0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
26dc0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
26dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26de0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
26df0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
26e00 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
26e10 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
26e20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
26e30 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
26e40 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
26e50 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
26e60 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
26e70 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
26e80 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
26e90 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
26ea0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
26eb0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
26ec0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
26ed0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
26ee0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
26ef0 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  62 */.    }.    
26f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
26f10 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74  arse->db, zStart
26f20 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
26f30 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
26f40 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20  db, zEndAff);.. 
26f50 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
26f60 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
26f70 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
26f80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26f90 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
26fa0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
26fb0 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
26fc0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
26fd0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
26fe0 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52   op = aEndOp[(pR
26ff0 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20  angeEnd || nEq) 
27000 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20  * (1 + bRev)];. 
27010 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
27020 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20  =OP_Noop );.    
27030 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
27040 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65  _IdxGE );.    te
27050 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
27060 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20  dxLT );.    if( 
27070 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
27080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27090 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
270a0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
270b0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
270c0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
270d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
270e0 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
270f0 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
27100 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27110 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
27120 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
27130 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
27140 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
27150 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
27160 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
27170 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
27180 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
27190 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
271a0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
271b0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
271c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
271d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
271e0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
271f0 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
27200 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
27210 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
27220 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
27230 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27240 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
27250 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  OP_LIMIT );.    
27260 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
27270 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
27280 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
27290 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
272a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
272b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
272c0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
272d0 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
272e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
272f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
27300 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
27310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
27320 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
27330 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
27340 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
27350 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
27360 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
27370 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
27380 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
27390 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
273a0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
273b0 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
273c0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
273d0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
273e0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
273f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
27400 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
27410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27420 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
27430 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
27440 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
27450 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
27460 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
27470 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
27480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
274a0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
274b0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
274c0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
274d0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
274e0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
274f0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
27500 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
27510 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
27520 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
27530 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
27540 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
27550 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
27560 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
27570 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27580 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  RE_UNIQUE ){.   
27590 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
275a0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
275b0 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
275c0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
275d0 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
275e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
275f0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
27600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
27610 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
27620 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
27630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
27640 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
27650 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
27660 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27670 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
27680 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77    /* Case 4:  Tw
27690 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
276a0 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
276b0 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
276c0 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
276d0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
276e0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
276f0 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
27700 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
27710 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
27720 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
27730 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
27740 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
27750 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
27760 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
27770 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
27780 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
27790 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
277a0 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
277b0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
277c0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
277d0 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
277e0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
277f0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
27800 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
27810 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
27820 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
27830 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
27840 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
27860 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
27870 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
27880 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
27890 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
278a0 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
278b0 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
278c0 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
278d0 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
278e0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
278f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
27900 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
27910 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
27920 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
27930 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
27940 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
27950 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
27960 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
27970 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
27980 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
27990 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
279a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
279b0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
279c0 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
279d0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
279e0 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
279f0 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
27a00 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
27a10 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
27a20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
27a30 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
27a40 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27a50 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
27a60 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
27a70 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
27a80 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
27a90 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
27aa0 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
27ab0 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
27ac0 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
27ad0 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
27ae0 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
27af0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27b00 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
27b10 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
27b20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
27b30 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
27b40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
27b50 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
27b60 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
27b70 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
27b80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27b90 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
27ba0 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
27bb0 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
27bc0 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
27bd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27be0 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
27c10 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
27c20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
27c30 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
27c40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
27c50 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
27c60 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
27c70 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
27c80 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
27c90 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
27ca0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
27cb0 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
27cc0 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
27cd0 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
27ce0 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  n */..    int re
27cf0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
27d00 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
27d10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
27d20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
27d30 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
27d40 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
27d70 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
27d80 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
27d90 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27db0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
27dc0 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
27dd0 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
27de0 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
27df0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
27e00 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
27e10 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
27e20 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
27e50 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
27e60 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
27e70 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27e90 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
27ea0 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
27eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
27ee0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
27ef0 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20   Expr *pAndExpr 
27f00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27f10 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e      /* An ".. AN
27f20 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  D (...)" express
27f30 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70  ion */.   .    p
27f40 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Term = pLevel->p
27f50 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20  lan.u.pTerm;.   
27f60 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
27f70 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27f80 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27f90 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20  r==WO_OR );.    
27fa0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
27fb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
27fc0 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
27fd0 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
27fe0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
27ff0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
28000 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
28010 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
28020 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
28030 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
28040 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20 63  List ni pOrTab c
28050 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
28060 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
28070 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
28080 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
28090 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
280a0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
280b0 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
280c0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
280d0 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
280e0 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
280f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
28100 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
28110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
28120 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
28130 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
28140 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
28150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
28160 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
28170 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
28180 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28190 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
281a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
281b0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
281c0 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
281d0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
281e0 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
281f0 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
28200 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
28210 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  aw(pParse->db,. 
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
28240 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
28250 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
28260 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
28270 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
28280 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
28290 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
282a0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29  ->nAlloc = (i16)
282b0 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
282c0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
282d0 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
282e0 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
282f0 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
28300 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
28310 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
28320 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
28330 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
28340 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
28350 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
28360 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
28370 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
28380 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
28390 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
283a0 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
283b0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
283c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
283d0 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
283e0 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
283f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
28400 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
28410 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
28420 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
28430 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
28440 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
28450 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
28460 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
28470 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
28480 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
28490 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
284a0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
284b0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
284c0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
284d0 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
284e0 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
284f0 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
28500 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
28510 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
28520 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
28530 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
28540 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
28550 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
28560 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
28570 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
28580 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
28590 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
285a0 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
285b0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
285c0 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
285d0 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
285e0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
285f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
28600 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
28610 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
28620 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
28630 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
28640 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
28650 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
28660 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
28670 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
28680 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
28690 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
286a0 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
286b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
286c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
286d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
286e0 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
286f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
28700 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
28710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
28720 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
28730 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  urn);..    /* If
28740 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   the original WH
28750 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a 20  ERE clause is z 
28760 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28 78  of the form:  (x
28770 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
28780 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68 65  AND y.    ** The
28790 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  n for every term
287a0 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61 73   xN, evaluate as
287b0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
287c0 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20 20  on: xN AND z.   
287d0 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74 65   ** That way, te
287e0 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61 72  rms in y that ar
287f0 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f 20  e factored into 
28800 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e 20  the disjunction 
28810 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
28820 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65 20  icked up by the 
28830 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
28840 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
28850 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20 20  egin() below..  
28860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 74 75    **.    ** Actu
28870 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62 65 78  ally, each subex
28880 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 76  pression is conv
28890 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41 4e 44  erted to "xN AND
288a0 20 77 22 20 77 68 65 72 65 20 77 20 69 73 0a 20   w" where w is. 
288b0 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74 65 72     ** the "inter
288c0 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20 6f 66  esting" terms of
288d0 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61 74 20   z - terms that 
288e0 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
288f0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
28900 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
28910 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
28920 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74 68 61  N, and terms tha
28930 74 20 61 72 65 20 75 73 61 62 6c 65 20 61 73 20  t are usable as 
28940 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  .    ** indices.
28950 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28960 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
28970 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
28980 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
28990 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
289a0 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
289b0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
289c0 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
289d0 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
289e0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
289f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
28a00 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
28a10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
28a20 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  f( pWC->a[iTerm]
28a30 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  .wtFlags & (TERM
28a40 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 4f 52  _VIRTUAL|TERM_OR
28a50 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69 6e 75 65  INFO) ) continue
28a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
28a70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70  WC->a[iTerm].eOp
28a80 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29  erator & WO_ALL)
28a90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
28aa0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
28ab0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
28ac0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
28ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41  , 0);.        pA
28ae0 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ndExpr = sqlite3
28af0 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
28b00 64 62 2c 20 70 41 6e 64 45 78 70 72 2c 20 70 45  db, pAndExpr, pE
28b10 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
28b20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
28b30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 6e 64   ){.        pAnd
28b40 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
28b50 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
28b60 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78 70 72 2c  ND, 0, pAndExpr,
28b70 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
28b80 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   }..    for(ii=0
28b90 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72  ; ii<pOrWc->nTer
28ba0 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
28bb0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
28bc0 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69  rm = &pOrWc->a[i
28bd0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  i];.      if( pO
28be0 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
28bf0 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65  r==iCur || pOrTe
28c00 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
28c10 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
28c20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
28c30 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
28c40 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
28c50 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
28c60 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
28c70 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65  *pOrExpr = pOrTe
28c80 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
28c90 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20     if( pAndExpr 
28ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
28cb0 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
28cc0 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
28cd0 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
28ce0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
28cf0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
28d00 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
28d10 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
28d20 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
28d30 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49  /.        pSubWI
28d40 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
28d50 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
28d60 70 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c  pOrTab, pOrExpr,
28d70 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
28d90 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
28da0 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44  LOSE | WHERE_AND
28db0 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20  _ONLY |.        
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dd0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
28de0 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  E | WHERE_ONETAB
28df0 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20  LE_ONLY);.      
28e00 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20    if( pSubWInfo 
28e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
28e20 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20  lainOneScan(.   
28e30 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
28e40 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
28e50 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
28e60 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
28e70 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20  om, 0.          
28e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28e90 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28ea0 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
28eb0 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
28ec0 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d        int iSet =
28ed0 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54   ((ii==pOrWc->nT
28ee0 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20  erm-1)?-1:ii);. 
28ef0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
28f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20  ;.            r 
28f10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28f20 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
28f30 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  e, pTabItem->pTa
28f40 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20  b, -1, iCur, .  
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 29         regRowid)
28f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
28f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
28fa0 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
28fb0 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
28ff0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
29000 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
29010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
29020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29030 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
29040 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
29050 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
29060 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
29070 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
29080 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
29090 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
290a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
290b0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
290c0 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
290d0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
290e0 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
290f0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
29100 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
29110 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
29120 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
29130 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
29140 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
29150 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
29160 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
29170 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
29180 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
29190 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
291a0 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20        /* Finish 
291b0 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  the loop through
291c0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
291d0 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
291e0 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
291f0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
29200 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b  eEnd(pSubWInfo);
29210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29220 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29230 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
29240 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65     pAndExpr->pLe
29250 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
29260 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
29270 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 6e 64  pParse->db, pAnd
29280 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
29290 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
292a0 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74  geP1(v, iRetInit
292b0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
292c0 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
292d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
292e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
292f0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  0, pLevel->addrB
29300 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rk);.    sqlite3
29310 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
29320 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  (v, iLoopBody);.
29330 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
29340 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69  >nLevel>1 ) sqli
29350 74 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61  te3StackFree(pPa
29360 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29  rse->db, pOrTab)
29370 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73  ;.    if( !untes
29380 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62  tedTerms ) disab
29390 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
293a0 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Term);.  }else.#
293b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
293c0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
293d0 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20  TION */..  {.   
293e0 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65   /* Case 5:  The
293f0 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
29400 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
29410 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
29420 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63    **          sc
29430 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  an of the entire
29440 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
29450 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
29460 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f  u8 aStep[] = { O
29470 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20  P_Next, OP_Prev 
29480 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
29490 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20  nst u8 aStart[] 
294a0 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f  = { OP_Rewind, O
294b0 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73  P_Last };.    as
294c0 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c  sert( bRev==0 ||
294d0 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20   bRev==1 );.    
294e0 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
294f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76  e==0 );.    pLev
29500 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
29510 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
29520 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
29530 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
29540 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
29550 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
29560 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
29570 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
29580 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
29590 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
295a0 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74  _STEP;.  }.  not
295b0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
295c0 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
295d0 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e   iCur);..  /* In
295e0 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
295f0 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
29600 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
29610 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a  e completely.  *
29620 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
29630 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
29640 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a   of tables..  **
29650 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
29660 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35  TION-OF: R-49525
29670 2d 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61  -50935 Terms tha
29680 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69  t cannot be sati
29690 73 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20  sfied through.  
296a0 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e  ** the use of in
296b0 64 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73  dices become tes
296c0 74 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c  ts that are eval
296d0 75 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61  uated against ea
296e0 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74  ch row of.  ** t
296f0 68 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75  he relevant inpu
29700 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
29710 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
29720 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
29730 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
29740 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
29750 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
29760 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
29770 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
29780 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37  ; /* IMP: R-3057
29790 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74  5-11662 */.    t
297a0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
297b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
297c0 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ODED );.    if( 
297d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
297e0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
297f0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
29800 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
29810 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
29820 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
29830 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
29840 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
29850 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
29860 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
29870 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
29880 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
29890 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
298a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
298b0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
298c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
298d0 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
298e0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
298f0 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
29900 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
29910 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
29920 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29930 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
29940 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
29950 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ue;.    }.    sq
29960 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29970 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64  (pParse, pE, add
29980 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55  rCont, SQLITE_JU
29990 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
299a0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
299b0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
299c0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
299d0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
299e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
299f0 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
29a00 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
29a10 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
29a20 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
29a30 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
29a40 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
29a50 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
29a60 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
29a70 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
29a80 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
29a90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
29aa0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
29ab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
29ac0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
29ad0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
29ae0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
29af0 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
29b00 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
29b10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
29b20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
29b30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
29b40 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
29b50 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
29b60 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
29b70 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
29b80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
29b90 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49  VIRTUAL );  /* I
29ba0 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  MP: R-30575-1166
29bb0 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  2 */.      testc
29bc0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
29bd0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
29be0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
29bf0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
29c00 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
29c10 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
29c20 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
29c30 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
29c40 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
29c50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
29c60 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
29c70 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
29c80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
29c90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29ca0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
29cb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
29cc0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
29cd0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
29ce0 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
29cf0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
29d00 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
29d10 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
29d20 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
29d30 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
29d40 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
29d50 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
29d60 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
29d70 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
29d80 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
29d90 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
29da0 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
29db0 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
29dc0 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
29dd0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
29de0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
29df0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
29e00 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
29e10 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
29e20 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
29e30 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
29e40 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
29e50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
29e60 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
29e70 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
29e80 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
29e90 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
29ea0 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
29eb0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
29ec0 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
29ed0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29ee0 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
29ef0 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
29f00 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
29f10 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
29f20 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
29f30 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
29f40 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
29f50 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
29f60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
29f70 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
29f80 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
29f90 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  WInfo) ){.    in
29fa0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
29fb0 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ; i<pWInfo->nLev
29fc0 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
29fd0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
29fe0 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e  fo *pInfo = pWIn
29ff0 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66  fo->a[i].pIdxInf
2a000 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
2a010 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
2a020 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
2a030 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2a040 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2a050 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20  cFailed ); */.  
2a060 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
2a070 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2a080 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
2a090 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66  qlite3_free(pInf
2a0a0 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
2a0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2a0c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2a0d0 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  pInfo);.      }.
2a0e0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2a0f0 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[i].plan.wsFl
2a100 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
2a110 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20  _INDEX ){.      
2a120 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2a130 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61  pWInfo->a[i].pla
2a140 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
2a150 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2a160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2a170 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e  bFree(db, pIdx->
2a180 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20  zColAff);.      
2a190 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a1a0 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20  e(db, pIdx);.   
2a1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a1c0 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c     }.    whereCl
2a1d0 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f  auseClear(pWInfo
2a1e0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69  ->pWC);.    sqli
2a1f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
2a200 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Info);.  }.}.../
2a210 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2a220 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2a230 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
2a240 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2a250 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
2a260 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2a270 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2a280 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
2a290 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
2a2a0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
2a2b0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
2a2c0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
2a2d0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
2a2e0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
2a2f0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
2a300 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
2a310 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2a320 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2a330 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
2a340 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
2a350 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2a360 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
2a370 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2a380 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
2a390 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
2a3a0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
2a3b0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
2a3c0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
2a3d0 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
2a3e0 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
2a3f0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
2a400 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
2a410 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
2a420 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
2a430 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
2a440 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
2a450 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
2a460 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
2a470 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
2a480 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
2a490 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
2a4a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
2a4b0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
2a4c0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
2a4d0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
2a4e0 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
2a4f0 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
2a500 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
2a510 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2a520 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
2a530 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2a540 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
2a550 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
2a560 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2a570 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
2a580 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
2a590 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
2a5a0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
2a5b0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2a5c0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
2a5e0 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
2a5f0 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
2a620 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
2a630 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
2a660 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
2a670 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
2a680 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
2a690 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
2a6a0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
2a6b0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
2a6c0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
2a6d0 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
2a6e0 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
2a6f0 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
2a700 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
2a710 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
2a720 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
2a730 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
2a740 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
2a750 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
2a760 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
2a770 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
2a780 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
2a790 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2a7a0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
2a7b0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
2a7c0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
2a7d0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
2a7e0 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
2a7f0 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
2a800 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
2a810 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
2a820 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
2a830 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
2a840 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
2a850 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
2a860 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2a870 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
2a880 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
2a890 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
2a8a0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
2a8b0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
2a8c0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
2a8d0 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
2a8e0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2a8f0 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
2a900 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
2a910 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
2a920 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
2a930 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
2a940 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
2a950 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
2a960 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
2a970 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
2a980 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
2a990 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
2a9a0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
2a9b0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
2a9c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
2a9d0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
2a9e0 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
2a9f0 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
2aa00 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
2aa10 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
2aa20 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
2aa30 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
2aa40 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
2aa50 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
2aa60 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
2aa70 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
2aa80 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
2aa90 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2aaa0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
2aab0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
2aac0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
2aad0 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
2aae0 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
2aaf0 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
2ab00 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
2ab10 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
2ab20 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
2ab30 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
2ab40 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2ab50 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
2ab60 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
2ab70 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
2ab80 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
2ab90 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2aba0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
2abb0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
2abc0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
2abd0 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
2abe0 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
2abf0 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
2ac00 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
2ac10 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
2ac20 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2ac30 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
2ac40 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
2ac50 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
2ac60 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
2ac70 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
2ac80 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
2ac90 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
2aca0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
2acb0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
2acc0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
2acd0 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
2ace0 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
2acf0 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
2ad00 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
2ad10 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
2ad20 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
2ad30 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
2ad40 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
2ad50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2ad60 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
2ad70 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
2ad80 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
2ad90 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
2ada0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
2adb0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
2adc0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
2add0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
2ade0 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
2adf0 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
2ae00 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
2ae10 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
2ae20 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
2ae30 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
2ae40 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
2ae50 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
2ae60 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
2ae70 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
2ae80 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
2ae90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2aea0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2aeb0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
2aec0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
2aed0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
2aee0 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
2aef0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
2af00 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
2af10 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
2af20 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
2af30 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
2af40 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
2af50 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2af60 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
2af70 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
2af80 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
2af90 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
2afa0 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
2afb0 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
2afc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2afd0 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
2afe0 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
2aff0 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
2b000 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
2b010 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2b020 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
2b030 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
2b040 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
2b050 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
2b060 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
2b070 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
2b080 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
2b090 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
2b0a0 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
2b0b0 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
2b0c0 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
2b0d0 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
2b0e0 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
2b0f0 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
2b100 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
2b110 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
2b120 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
2b130 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
2b140 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2b150 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2b160 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2b170 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2b180 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
2b190 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
2b1a0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
2b1b0 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
2b1c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2b1d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2b1e0 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
2b1f0 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By, /* An ORDER 
2b200 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
2b210 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2b220 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a   *pDistinct,  /*
2b230 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   The select-list
2b240 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75   for DISTINCT qu
2b250 65 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20  eries - or NULL 
2b260 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
2b270 61 67 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ags        /* On
2b280 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
2b290 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
2b2a0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
2b2b0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2b2e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57   */.  int nByteW
2b2f0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
2b300 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
2b310 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
2b320 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
2b330 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b350 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2b360 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
2b370 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
2b380 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
2b390 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
2b3a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2b3b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2b3c0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
2b3d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
2b3e0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2b3f0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
2b400 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
2b410 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
2b420 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
2b430 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
2b440 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
2b450 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2b460 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
2b470 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
2b480 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
2b490 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
2b4a0 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70         /* Decomp
2b4b0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57  osition of the W
2b4c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2b4d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b4e0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
2b4f0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
2b500 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
2b510 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
2b520 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
2b530 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
2b540 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
2b550 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
2b560 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2b590 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
2b5a0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
2b5b0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2b5c0 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
2b5d0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
2b5e0 20 70 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67   pWC->a[].wtFlag
2b5f0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
2b600 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
2b610 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2b620 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
2b630 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2b640 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2b650 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
2b660 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
2b670 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
2b680 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
2b690 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
2b6a0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
2b6b0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
2b6c0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
2b6d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2b6e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2b6f0 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
2b700 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
2b710 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2b720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
2b730 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
2b740 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
2b750 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
2b760 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
2b770 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
2b780 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
2b790 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
2b7a0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
2b7b0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
2b7c0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
2b7d0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
2b7e0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
2b7f0 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
2b800 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
2b810 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2b820 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
2b830 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
2b840 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
2b850 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
2b860 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
2b870 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
2b880 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
2b890 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2b8a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
2b8b0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
2b8c0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
2b8d0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
2b8e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
2b8f0 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
2b900 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
2b910 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
2b920 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
2b930 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
2b940 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
2b950 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2b960 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
2b970 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
2b980 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
2b990 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
2b9a0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
2b9b0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
2b9c0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
2b9d0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
2b9e0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
2b9f0 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
2ba00 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
2ba10 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
2ba20 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
2ba30 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2ba40 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  b;.  nByteWInfo 
2ba50 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2ba60 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
2ba70 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
2ba80 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
2ba90 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
2baa0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
2bab0 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66  .      nByteWInf
2bac0 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  o + .      sizeo
2bad0 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b  f(WhereClause) +
2bae0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68  .      sizeof(Wh
2baf0 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b  ereMaskSet).  );
2bb00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2bb10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
2bb20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2bb30 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
2bb40 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
2bb50 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2bb60 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
2bb70 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
2bb80 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
2bb90 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2bba0 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
2bbb0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2bbc0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
2bbd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2bbe0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
2bbf0 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d  nfo->pWC = pWC =
2bc00 20 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29   (WhereClause *)
2bc10 26 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b  &((u8 *)pWInfo)[
2bc20 6e 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70  nByteWInfo];.  p
2bc30 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2bc40 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
2bc50 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
2bc60 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
2bc70 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
2bc80 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68    pMaskSet = (Wh
2bc90 65 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43  ereMaskSet*)&pWC
2bca0 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  [1];..  /* Disab
2bcb0 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
2bcc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
2bcd0 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2bce0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
2bcf0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
2bd00 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
2bd10 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
2bd20 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
2bd30 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2bd40 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20  ITE_DistinctOpt 
2bd50 29 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  ) pDistinct = 0;
2bd60 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
2bd70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2bd80 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
2bd90 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
2bda0 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
2bdb0 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
2bdc0 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
2bdd0 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
2bde0 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61   initMaskSet(pMa
2bdf0 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
2be00 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70  lauseInit(pWC, p
2be10 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c  Parse, pMaskSet,
2be20 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
2be30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
2be40 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
2be50 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
2be60 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65  eSplit(pWC, pWhe
2be70 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f  re, TK_AND);   /
2be80 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35  * IMP: R-15842-5
2be90 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f  3296 */.    .  /
2bea0 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
2beb0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2bec0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
2bed0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
2bee0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
2bef0 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
2bf00 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
2bf10 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
2bf20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
2bf30 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ere && (nTabList
2bf40 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
2bf50 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
2bf60 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
2bf70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2bf80 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2bf90 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
2bfa0 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55  Break, SQLITE_JU
2bfb0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
2bfc0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
2bfd0 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69    /* Assign a bi
2bfe0 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61  t from the bitma
2bff0 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  sk to every term
2c000 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c010 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  use..  **.  ** W
2c020 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69  hen assigning bi
2c030 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20  tmask values to 
2c040 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73  FROM clause curs
2c050 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ors, it must be.
2c060 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68    ** the case th
2c070 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62  at if X is the b
2c080 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e  itmask for the N
2c090 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  -th FROM clause 
2c0a0 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74  term then.  ** t
2c0b0 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  he bitmask for a
2c0c0 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ll FROM clause t
2c0d0 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74  erms to the left
2c0e0 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72   of the N-th ter
2c0f0 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e  m.  ** is (X-1).
2c100 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e     An expression
2c110 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61   from the ON cla
2c120 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  use of a LEFT JO
2c130 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20  IN can use.  ** 
2c140 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a  its Expr.iRightJ
2c150 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74  oinTable value t
2c160 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61  o find the bitma
2c170 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  sk of the right 
2c180 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68  table.  ** of th
2c190 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63  e join.  Subtrac
2c1a0 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68  ting one from th
2c1b0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69  e right table bi
2c1c0 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20  tmask gives a.  
2c1d0 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61  ** bitmask for a
2c1e0 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
2c1f0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
2c200 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20  n.  Knowing the 
2c210 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72  bitmask.  ** for
2c220 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2c230 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66  he left of a lef
2c240 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74  t join is import
2c250 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ant.  Ticket #30
2c260 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  15..  **.  ** Co
2c270 6e 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72  nfigure the Wher
2c280 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61  eClause.vmask va
2c290 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62  riable so that b
2c2a0 69 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70  its that corresp
2c2b0 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74  ond.  ** to virt
2c2c0 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ual table cursor
2c2d0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
2c2e0 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63  is used to selec
2c2f0 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a  tively disable .
2c300 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49    ** the OR-to-I
2c310 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  N transformation
2c320 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f   in exprAnalyzeO
2c330 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e  rTerm(). It is n
2c340 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a  ot helpful .  **
2c350 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61   with virtual ta
2c360 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
2c370 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73  Note that bitmas
2c380 6b 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ks are created f
2c390 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d  or all pTabList-
2c3a0 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a  >nSrc tables in.
2c3b0 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e    ** pTabList, n
2c3c0 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73  ot just the firs
2c3d0 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65  t nTabList table
2c3e0 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20  s.  nTabList is 
2c3f0 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71  normally.  ** eq
2c400 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
2c410 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
2c420 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
2c430 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48  1 if the.  ** WH
2c440 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2c450 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20  Y flag is set.. 
2c460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
2c470 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70  C->vmask==0 && p
2c480 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b  MaskSet->n==0 );
2c490 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2c4a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2c4b0 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
2c4c0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2c4d0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2c4e0 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  sor);.#ifndef SQ
2c4f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c500 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41  LTABLE.    if( A
2c510 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e  LWAYS(pTabList->
2c520 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73  a[i].pTab) && Is
2c530 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74  Virtual(pTabList
2c540 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a  ->a[i].pTab) ){.
2c550 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b        pWC->vmask
2c560 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20   |= ((Bitmask)1 
2c570 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  << i);.    }.#en
2c580 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  dif.  }.#ifndef 
2c590 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42  NDEBUG.  {.    B
2c5a0 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74  itmask toTheLeft
2c5b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
2c5c0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
2c5d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2c5e0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74   Bitmask m = get
2c5f0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2c600 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
2c610 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73  ursor);.      as
2c620 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54  sert( (m-1)==toT
2c630 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  heLeft );.      
2c640 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a  toTheLeft |= m;.
2c650 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c660 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
2c670 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
2c680 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
2c690 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
2c6a0 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
2c6b0 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
2c6c0 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
2c6d0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2c6e0 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
2c6f0 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
2c700 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
2c710 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
2c720 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
2c730 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
2c740 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
2c750 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
2c760 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
2c770 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
2c780 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41  ed..  */.  exprA
2c790 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
2c7a0 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20  st, pWC);.  if( 
2c7b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c7c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
2c7d0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2c7e0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
2c7f0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
2c800 61 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72  alifier, if ther
2c810 65 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64  e is one, is red
2c820 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66  undant. .  ** If
2c830 20 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74   it is, then set
2c840 20 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55   pDistinct to NU
2c850 4c 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f  LL and WhereInfo
2c860 2e 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20  .eDistinct to.  
2c870 2a 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  ** WHERE_DISTINC
2c880 54 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c  T_UNIQUE to tell
2c890 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69   the caller to i
2c8a0 67 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e  gnore the DISTIN
2c8b0 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  CT..  */.  if( p
2c8c0 44 69 73 74 69 6e 63 74 20 26 26 20 69 73 44 69  Distinct && isDi
2c8d0 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28  stinctRedundant(
2c8e0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2c8f0 2c 20 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74  , pWC, pDistinct
2c900 29 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e  ) ){.    pDistin
2c910 63 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e  ct = 0;.    pWIn
2c920 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2c930 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2c940 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NIQUE;.  }..  /*
2c950 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
2c960 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2c970 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
2c980 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
2c990 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2c9a0 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
2c9b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
2c9c0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
2c9d0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
2c9e0 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
2c9f0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
2ca00 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
2ca10 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
2ca20 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57  >a[].wsFlags   W
2ca30 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
2ca40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2ca50 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
2ca60 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
2ca70 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
2ca80 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
2ca90 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
2caa0 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
2cab0 20 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20    Which term of 
2cac0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2cad0 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20  is being coded. 
2cae0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2caf0 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20  ].iTabCur   The 
2cb00 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
2cb10 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
2cb20 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  le.  **   pWInfo
2cb30 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20  ->a[].iIdxCur   
2cb40 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
2cb50 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
2cb60 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2cb70 2e 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20  .pTerm     When 
2cb80 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20  wsFlags==WO_OR, 
2cb90 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65  the OR-clause te
2cba0 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  rm.  **.  ** Thi
2cbb0 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
2cbc0 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
2cbd0 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
2cbe0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
2cbf0 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
2cc00 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
2cc10 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e  (Bitmask)0;.  an
2cc20 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57  dFlags = ~0;.  W
2cc30 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2cc40 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
2cc50 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28  ***\n"));.  for(
2cc60 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65  i=iFrom=0, pLeve
2cc70 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e  l=pWInfo->a; i<n
2cc80 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c  TabList; i++, pL
2cc90 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65  evel++){.    Whe
2cca0 72 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b  reCost bestPlan;
2ccb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
2ccc0 20 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20   efficient plan 
2ccd0 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
2cce0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cd00 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d  * Index for FROM
2cd10 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74   table at pTabIt
2cd20 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b  em */.    int j;
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
2cd50 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74  ping over FROM t
2cd60 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ables */.    int
2cd70 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20   bestJ = -1;    
2cd80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cd90 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
2cda0 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cdc0 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
2cdd0 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
2cde0 0a 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d  .    int isOptim
2cdf0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2ce00 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
2ce10 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74   optimal/non-opt
2ce20 69 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20  imal search */. 
2ce30 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72     int nUnconstr
2ce40 61 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f  ained;         /
2ce50 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20  * Number tables 
2ce60 77 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20  without INDEXED 
2ce70 42 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73  BY */.    Bitmas
2ce80 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20  k notIndexed;   
2ce90 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
2cea0 20 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e   tables that can
2ceb0 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
2cec0 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
2ced0 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69  &bestPlan, 0, si
2cee0 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b  zeof(bestPlan));
2cef0 0a 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43  .    bestPlan.rC
2cf00 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
2cf10 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54  _DBL;.    WHERET
2cf20 52 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e  RACE(("*** Begin
2cf30 20 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70   search for loop
2cf40 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b   %d ***\n", i));
2cf50 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
2cf60 72 6f 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e  rough the remain
2cf70 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74  ing entries in t
2cf80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
2cf90 6f 20 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a  o find the.    *
2cfa0 2a 20 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f  * next nested lo
2cfb0 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73  op. The loop tes
2cfc0 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  ts all FROM clau
2cfd0 73 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  se entries.    *
2cfe0 2a 20 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72  * either once or
2cff0 20 74 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a   twice. .    **.
2d000 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2d010 20 74 65 73 74 20 69 73 20 61 6c 77 61 79 73 20   test is always 
2d020 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
2d030 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
2d040 72 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  re entries.    *
2d050 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20  * remaining and 
2d060 6e 65 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20  never performed 
2d070 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  if there is only
2d080 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   one FROM clause
2d090 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f   entry.    ** to
2d0a0 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54   choose from.  T
2d0b0 68 65 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f  he first test lo
2d0c0 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69  oks for an "opti
2d0d0 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20  mal" scan.  In. 
2d0e0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65     ** this conte
2d0f0 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  xt an optimal sc
2d100 61 6e 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75  an is one that u
2d110 73 65 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  ses the same str
2d120 61 74 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72  ategy.    ** for
2d130 20 74 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20   the given FROM 
2d140 63 6c 61 75 73 65 20 65 6e 74 72 79 20 61 73 20  clause entry as 
2d150 77 6f 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65  would be selecte
2d160 64 20 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20  d if the entry. 
2d170 20 20 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20     ** were used 
2d180 61 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74  as the innermost
2d190 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49   nested loop.  I
2d1a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
2d1b0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
2d1c0 20 63 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61   chosen such tha
2d1d0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75  t the cost of ru
2d1e0 6e 6e 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65  nning that table
2d1f0 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63   cannot be reduc
2d200 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69  ed.    ** by wai
2d210 74 69 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74  ting for other t
2d220 61 62 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72  ables to run fir
2d230 73 74 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d  st.  This "optim
2d240 61 6c 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20  al" test works. 
2d250 20 20 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61     ** by first a
2d260 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
2d270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2d280 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  on the inner loo
2d290 70 20 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20  p and finding.  
2d2a0 20 20 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70    ** its query p
2d2b0 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69  lan, then checki
2d2c0 6e 67 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ng to see if tha
2d2d0 74 20 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65  t query plan use
2d2e0 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68  s any.    ** oth
2d2f0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  er FROM clause t
2d300 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f  erms that are no
2d310 74 52 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e  tReady.  If no n
2d320 6f 74 52 65 61 64 79 20 74 65 72 6d 73 20 61 72  otReady terms ar
2d330 65 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68  e.    ** used th
2d340 65 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  en the "optimal"
2d350 20 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b   query plan work
2d360 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
2d370 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57   Note that the W
2d380 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61  hereCost.nRow pa
2d390 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
2d3a0 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68  ptimal scan migh
2d3b0 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20  t.    ** not be 
2d3c0 61 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77  as small as it w
2d3d0 6f 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74  ould be if the t
2d3e0 61 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65  able really were
2d3f0 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20   the innermost. 
2d400 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65     ** join.  The
2d410 20 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20   nRow value can 
2d420 62 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48  be reduced by WH
2d430 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2d440 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68  raints.    ** th
2d450 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e  at do not use in
2d460 64 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73  dices.  But this
2d470 20 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20   nRow reduction 
2d480 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
2d490 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
2d4a0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69   really is the i
2d4b0 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20  nnermost join.  
2d4c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2d4d0 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69  he second loop i
2d4e0 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  teration is only
2d4f0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f   performed if no
2d500 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20   optimal scan.  
2d510 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20    ** strategies 
2d520 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68  were found by th
2d530 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2d540 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69  n. This second i
2d550 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
2d560 69 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63  is used to searc
2d570 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74  h for the lowest
2d580 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61   cost scan overa
2d590 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ll..    **.    *
2d5a0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
2d5b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65  ons of SQLite pe
2d5c0 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65  rformed only the
2d5d0 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
2d5e0 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  n -.    ** the n
2d5f0 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f  ext outermost lo
2d600 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68  op was always th
2d610 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65  at with the lowe
2d620 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a  st overall.    *
2d630 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c  * cost. However,
2d640 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74   this meant that
2d650 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65   SQLite could se
2d660 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70  lect the wrong p
2d670 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73  lan.    ** for s
2d680 63 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74  cripts such as t
2d690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
2d6a0 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20    **   .    **  
2d6b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2d6c0 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20  (a, b); .    ** 
2d6d0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2d6e0 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20  2(c, d);.    ** 
2d6f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2d700 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e  t2, t1 WHERE t2.
2d710 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20  rowid = t1.a;.  
2d720 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2d730 62 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73  best strategy is
2d740 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2d750 75 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72  ugh table t1 fir
2d760 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20  st. However it. 
2d770 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73     ** is not pos
2d780 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
2d790 6e 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73  ne this with a s
2d7a0 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67  imple greedy alg
2d7b0 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53  orithm..    ** S
2d7c0 69 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ince the cost of
2d7d0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
2d7e0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20  hrough table t2 
2d7f0 69 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20  is the same .   
2d800 20 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20   ** as the cost 
2d810 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  of a linear scan
2d820 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2d830 31 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65  1, a simple gree
2d840 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72  dy .    ** algor
2d850 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20  ithm may choose 
2d860 74 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68  to use t2 for th
2d870 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68  e outer loop, wh
2d880 69 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20  ich is a much.  
2d890 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70    ** costlier ap
2d8a0 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20  proach..    */. 
2d8b0 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65     nUnconstraine
2d8c0 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e  d = 0;.    notIn
2d8d0 64 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66  dexed = 0;.    f
2d8e0 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46  or(isOptimal=(iF
2d8f0 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b  rom<nTabList-1);
2d900 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
2d910 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
2d920 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  mal--){.      Bi
2d930 74 6d 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20  tmask mask;     
2d940 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2d950 6f 66 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65  of tables not ye
2d960 74 20 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20  t ready */.     
2d970 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
2d980 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
2d990 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69  ->a[j]; j<nTabLi
2d9a0 73 74 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65  st; j++, pTabIte
2d9b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  m++){.        in
2d9c0 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20  t doNotReorder; 
2d9d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d9e0 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  is table should 
2d9f0 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64  not be reordered
2da00 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72   */.        Wher
2da10 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20  eCost sCost;    
2da20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61   /* Cost informa
2da30 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56  tion from best[V
2da40 69 72 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a  irtual]Index() *
2da50 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2da60 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f  st *pOrderBy;  /
2da70 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
2da80 65 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f  e for index to o
2da90 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ptimize */.     
2daa0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69     ExprList *pDi
2dab0 73 74 3b 20 20 20 20 20 2f 2a 20 44 49 53 54 49  st;     /* DISTI
2dac0 4e 43 54 20 63 6c 61 75 73 65 20 66 6f 72 20 69  NCT clause for i
2dad0 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65  ndex to optimize
2dae0 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64   */.  .        d
2daf0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28  oNotReorder =  (
2db00 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pTabItem->jointy
2db10 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
2db20 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
2db30 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
2db40 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
2db50 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2db60 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
2db70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
2db80 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2db90 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
2dba0 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
2dbb0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
2dbc0 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
2dbd0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2dbe0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2dbf0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73        mask = (is
2dc00 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f  Optimal ? m : no
2dc10 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20  tReady);.       
2dc20 20 70 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d   pOrderBy = ((i=
2dc30 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
2dc40 29 3f 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b  )?*ppOrderBy:0);
2dc50 0a 20 20 20 20 20 20 20 20 70 44 69 73 74 20 3d  .        pDist =
2dc60 20 28 69 3d 3d 30 20 3f 20 70 44 69 73 74 69 6e   (i==0 ? pDistin
2dc70 63 74 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  ct : 0);.       
2dc80 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 70   if( pTabItem->p
2dc90 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f  Index==0 ) nUnco
2dca0 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a  nstrained++;.  .
2dcb0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
2dcc0 43 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20  CE(("=== trying 
2dcd0 74 61 62 6c 65 20 25 64 20 77 69 74 68 20 69 73  table %d with is
2dce0 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e  Optimal=%d ===\n
2dcf0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dd00 20 20 20 20 20 20 20 6a 2c 20 69 73 4f 70 74 69         j, isOpti
2dd10 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61  mal));.        a
2dd20 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
2dd30 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66  >pTab );.#ifndef
2dd40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2dd50 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2dd60 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
2dd70 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20  pTabItem->pTab) 
2dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2dd90 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
2dda0 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  **pp = &pWInfo->
2ddb0 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[j].pIdxInfo;. 
2ddc0 20 20 20 20 20 20 20 20 20 62 65 73 74 56 69 72           bestVir
2ddd0 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
2dde0 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
2ddf0 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c   mask, notReady,
2de00 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 20 20 20 20 20 26 73 43 6f 73 74 2c 20 70 70        &sCost, pp
2de30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2de40 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
2de50 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73   {.          bes
2de60 74 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72  tBtreeIndex(pPar
2de70 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
2de80 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64  m, mask, notRead
2de90 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  y, pOrderBy,.   
2dea0 20 20 20 20 20 20 20 20 20 20 20 70 44 69 73 74             pDist
2deb0 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20  , &sCost);.     
2dec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2ded0 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c  ert( isOptimal |
2dee0 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f  | (sCost.used&no
2def0 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20  tReady)==0 );.. 
2df00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
2df10 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2df20 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  e is present, th
2df30 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74  en the plan must
2df40 20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20   use that.      
2df50 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74    ** index if it
2df60 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20   uses any index 
2df70 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  at all */.      
2df80 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2df90 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20  em->pIndex==0 . 
2dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfb0 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e   || (sCost.plan.
2dfc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2dfd0 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2dfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dff0 20 20 20 7c 7c 20 73 43 6f 73 74 2e 70 6c 61 6e     || sCost.plan
2e000 2e 75 2e 70 49 64 78 3d 3d 70 54 61 62 49 74 65  .u.pIdx==pTabIte
2e010 6d 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20  m->pIndex );..  
2e020 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 74 69        if( isOpti
2e030 6d 61 6c 20 26 26 20 28 73 43 6f 73 74 2e 70 6c  mal && (sCost.pl
2e040 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2e050 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
2e060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e070 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d   notIndexed |= m
2e080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2e090 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
2e0a0 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68 20 74  ns under which t
2e0b0 68 69 73 20 74 61 62 6c 65 20 62 65 63 6f 6d 65  his table become
2e0c0 73 20 74 68 65 20 62 65 73 74 20 73 6f 20 66 61  s the best so fa
2e0d0 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r:.        **.  
2e0e0 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54        **   (1) T
2e0f0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f  he table must no
2e100 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65  t depend on othe
2e110 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61  r tables that ha
2e120 76 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  ve not.        *
2e130 2a 20 20 20 20 20 20 20 79 65 74 20 72 75 6e 2e  *       yet run.
2e140 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e150 20 20 20 20 2a 2a 20 20 20 28 32 29 20 41 20 66      **   (2) A f
2e160 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70  ull-table-scan p
2e170 6c 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65 72  lan cannot super
2e180 63 65 64 65 20 69 6e 64 65 78 65 64 20 70 6c 61  cede indexed pla
2e190 6e 20 75 6e 6c 65 73 73 0a 20 20 20 20 20 20 20  n unless.       
2e1a0 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 66 75   **       the fu
2e1b0 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69 73  ll-table-scan is
2e1c0 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c   an "optimal" pl
2e1d0 61 6e 20 61 73 20 64 65 66 69 6e 65 64 20 61 62  an as defined ab
2e1e0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ove..        **.
2e1f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29          **   (3)
2e200 20 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65   All tables have
2e210 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2e220 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61  lause or this ta
2e230 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20  ble lacks an.   
2e240 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e       **       IN
2e250 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
2e260 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 75 73  or this table us
2e270 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63 0a  es the specific.
2e280 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2e290 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
2e2a0 20 62 79 20 69 74 73 20 49 4e 44 45 58 45 44 20   by its INDEXED 
2e2b0 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73  BY clause.  This
2e2c0 20 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20   rule ensures.  
2e2d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
2e2e0 68 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61  hat a best-so-fa
2e2f0 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65  r is always sele
2e300 63 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20  cted even if an 
2e310 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  impossible.     
2e320 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62     **       comb
2e330 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58  ination of INDEX
2e340 45 44 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  ED BY clauses ar
2e350 65 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72  e given.  The er
2e360 72 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ror.        **  
2e370 20 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74       will be det
2e380 65 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65  ected and relaye
2e390 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70  d back to the ap
2e3a0 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e  plication later.
2e3b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2e3c0 20 20 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f    The NEVER() co
2e3d0 6d 65 73 20 61 62 6f 75 74 20 62 65 63 61 75 73  mes about becaus
2e3e0 65 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65  e rule (2) above
2e3f0 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
2e400 20 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e    **       An in
2e410 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62  dexable full-tab
2e420 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61  le-scan from rea
2e430 63 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a  ching rule (3)..
2e440 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2e450 20 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20     **   (4) The 
2e460 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62  plan cost must b
2e470 65 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69  e lower than pri
2e480 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65  or plans or else
2e490 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2e4a0 20 20 20 20 20 20 63 6f 73 74 20 6d 75 73 74 20        cost must 
2e4b0 62 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  be the same and 
2e4c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2e4d0 77 73 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72  ws must be lower
2e4e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e4f0 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74 2e       if( (sCost.
2e500 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
2e510 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2e520 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
2e530 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  /.            &&
2e540 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f   (bestJ<0 || (no
2e550 74 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20  tIndexed&m)!=0  
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e570 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
2e580 20 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74 50         || (bestP
2e590 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2e5a0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
2e5b0 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20  LSCAN)==0.      
2e5c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
2e5d0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
2e5e0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
2e5f0 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20 20 20 20  LSCAN)!=0).     
2e600 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f         && (nUnco
2e610 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20  nstrained==0 || 
2e620 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2e630 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  ==0   /* (3) */.
2e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e650 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f 73 74 2e  || NEVER((sCost.
2e660 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e670 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2e680 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20  N)!=0)).        
2e690 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20      && (bestJ<0 
2e6a0 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62  || sCost.rCost<b
2e6b0 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20  estPlan.rCost   
2e6c0 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2e6e0 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65  (sCost.rCost<=be
2e6f0 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20  stPlan.rCost .  
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2e710 26 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  & sCost.plan.nRo
2e720 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  w<bestPlan.plan.
2e730 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20 29  nRow)).        )
2e740 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  {.          WHER
2e750 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 61 62  ETRACE(("=== tab
2e760 6c 65 20 25 64 20 69 73 20 62 65 73 74 20 73 6f  le %d is best so
2e770 20 66 61 72 22 0a 20 20 20 20 20 20 20 20 20 20   far".          
2e780 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69              " wi
2e790 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e  th cost=%g and n
2e7a0 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20  Row=%g\n",.     
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7c0 20 6a 2c 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c   j, sCost.rCost,
2e7d0 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77   sCost.plan.nRow
2e7e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  ));.          be
2e7f0 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a  stPlan = sCost;.
2e800 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20            bestJ 
2e810 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
2e820 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74         if( doNot
2e830 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
2e840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e850 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a     assert( bestJ
2e860 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
2e870 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65  t( notReady & ge
2e880 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2e890 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
2e8a0 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  J].iCursor) );. 
2e8b0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
2e8c0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65  *** Optimizer se
2e8d0 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66  lects table %d f
2e8e0 6f 72 20 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20  or loop %d".    
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69              " wi
2e900 74 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e  th cost=%g and n
2e910 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20  Row=%g\n",.     
2e920 20 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a             bestJ
2e930 2c 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d  , pLevel-pWInfo-
2e940 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f  >a, bestPlan.rCo
2e950 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  st, bestPlan.pla
2e960 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 2f 2a  n.nRow));.    /*
2e970 20 54 68 65 20 41 4c 57 41 59 53 28 29 20 74 68   The ALWAYS() th
2e980 61 74 20 66 6f 6c 6c 6f 77 73 20 77 61 73 20 61  at follows was a
2e990 64 64 65 64 20 74 6f 20 68 75 73 68 20 75 70 20  dded to hush up 
2e9a0 63 6c 61 6e 67 20 73 63 61 6e 2d 62 75 69 6c 64  clang scan-build
2e9b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 62 65 73   */.    if( (bes
2e9c0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2e9d0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
2e9e0 42 59 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  BY)!=0 && ALWAYS
2e9f0 28 70 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20  (ppOrderBy) ){. 
2ea00 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
2ea10 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2ea20 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
2ea30 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2ea40 45 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29  E_DISTINCT)!=0 )
2ea50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ea60 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2ea70 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  t==0 );.      pW
2ea80 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
2ea90 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2eaa0 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a  _ORDERED;.    }.
2eab0 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20      andFlags &= 
2eac0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2ead0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
2eae0 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c  l->plan = bestPl
2eaf0 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73  an.plan;.    tes
2eb00 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e  tcase( bestPlan.
2eb10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2eb20 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a  HERE_INDEXED );.
2eb30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65      testcase( be
2eb40 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
2eb50 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
2eb60 5f 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66  _INDEX );.    if
2eb70 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
2eb80 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2eb90 5f 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54  _INDEXED|WHERE_T
2eba0 45 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20  EMP_INDEX) ){.  
2ebb0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
2ebc0 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
2ebd0 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ab++;.    }else{
2ebe0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
2ebf0 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  IdxCur = -1;.   
2ec00 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20   }.    notReady 
2ec10 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73  &= ~getMask(pMas
2ec20 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2ec30 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72  a[bestJ].iCursor
2ec40 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  );.    pLevel->i
2ec50 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a  From = (u8)bestJ
2ec60 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c  ;.    if( bestPl
2ec70 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64  an.plan.nRow>=(d
2ec80 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20  ouble)1 ){.     
2ec90 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
2eca0 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e  oop *= bestPlan.
2ecb0 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d  plan.nRow;.    }
2ecc0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2ecd0 68 61 74 20 69 66 20 74 68 65 20 74 61 62 6c 65  hat if the table
2ece0 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73   scanned by this
2ecf0 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
2ed00 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e  had an.    ** IN
2ed10 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
2ed20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20  attached to it, 
2ed30 74 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69  that the named i
2ed40 6e 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20  ndex is being.  
2ed50 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68    ** used for th
2ed60 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20  e scan. If not, 
2ed70 74 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69  then query compi
2ed80 6c 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65  lation has faile
2ed90 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  d..    ** Return
2eda0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
2edb0 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54 61  /.    pIdx = pTa
2edc0 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
2edd0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
2ede0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pIdx ){.      if
2edf0 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ( (bestPlan.plan
2ee00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2ee10 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a  _INDEXED)==0 ){.
2ee20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ee30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2ee40 22 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65  "cannot use inde
2ee50 78 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  x: %s", pIdx->zN
2ee60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
2ee70 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2ee80 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
2ee90 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
2eea0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
2eeb0 75 73 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  use is used, the
2eec0 20 62 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e   bestIndex() fun
2eed0 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20  ction is.       
2eee0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
2eef0 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78  o find the index
2ef00 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2ef10 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
2ef20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  use.        ** i
2ef30 66 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64  f it find an ind
2ef40 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20  ex at all. */.  
2ef50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 65        assert( be
2ef60 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49  stPlan.plan.u.pI
2ef70 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20  dx==pIdx );.    
2ef80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ef90 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2efa0 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73   Optimizer Finis
2efb0 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  hed ***\n"));.  
2efc0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2efd0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2efe0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2eff0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2f000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2f010 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
2f020 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
2f030 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
2f040 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
2f050 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
2f060 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
2f070 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
2f080 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
2f090 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  & ppOrderBy ){. 
2f0a0 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
2f0b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
2f0c0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e  the caller is an
2f0d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2f0e0 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
2f0f0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20   is requesting. 
2f100 20 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65   ** to use a one
2f110 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c  -pass algorithm,
2f120 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
2f130 69 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  is is appropriat
2f140 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d  e..  ** The one-
2f150 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f  pass algorithm o
2f160 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65  nly works if the
2f170 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
2f180 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74  nstraints.  ** t
2f190 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
2f1a0 75 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20  update a single 
2f1b0 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  row..  */.  asse
2f1c0 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
2f1d0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2f1e0 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
2f1f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
2f200 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c   );.  if( (wctrl
2f210 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2f220 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
2f230 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26  0 && (andFlags &
2f240 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
2f250 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  0 ){.    pWInfo-
2f260 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a  >okOnePass = 1;.
2f270 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
2f280 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d  .plan.wsFlags &=
2f290 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59   ~WHERE_IDX_ONLY
2f2a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2f2b0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   all tables in t
2f2c0 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20  he pTabList and 
2f2d0 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65  any indices sele
2f2e0 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65  cted for.  ** se
2f2f0 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61  arching those ta
2f300 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  bles..  */.  sql
2f310 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
2f320 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29  hema(pParse, -1)
2f330 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20  ; /* Insert the 
2f340 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20  cookie verifier 
2f350 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  Goto */.  notRea
2f360 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2f370 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  ;.  pWInfo->nRow
2f380 4f 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b  Out = (double)1;
2f390 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
2f3a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
2f3b0 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70  nTabList; i++, p
2f3c0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
2f3d0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
2f3e0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
2f3f0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
2f400 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f410 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2f420 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
2f430 64 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62  dex */..    pTab
2f440 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2f450 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2f460 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
2f470 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
2f480 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
2f490 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2f4a0 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e  Cursor;.    pWIn
2f4b0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70  fo->nRowOut *= p
2f4c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
2f4d0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
2f4e0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2f4f0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2f500 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  ma);.    if( (pT
2f510 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2f520 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
2f530 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2f540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
2f550 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  nothing */.    }
2f560 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2f570 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2f580 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70  TABLE.    if( (p
2f590 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2f5a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
2f5b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
2f5c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2f5d0 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
2f5e0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47   char *)sqlite3G
2f5f0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
2f600 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b);.      int iC
2f610 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
2f620 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71  Cursor;.      sq
2f630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2f640 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75  v, OP_VOpen, iCu
2f650 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20  r, 0, 0, pVTab, 
2f660 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
2f670 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
2f680 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2f690 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2f6a0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
2f6b0 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
2f6c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
2f6d0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
2f6e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2f6f0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
2f700 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
2f710 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
2f720 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
2f730 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2f740 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2f750 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2f760 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
2f770 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
2f780 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2f790 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
2f7a0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2f7b0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
2f7c0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
2f7d0 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
2f7e0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2f7f0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
2f800 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
2f810 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2f820 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
2f830 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
2f840 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f850 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
2f860 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f870 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f890 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
2f8a0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
2f8b0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
2f8c0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
2f8d0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
2f8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2f8f0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2f900 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2f910 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2f920 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
2f930 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f940 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2f950 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
2f960 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f970 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2f980 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2f990 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2f9a0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2f9b0 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2f9c0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2f9d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
2f9e0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
2f9f0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2fa00 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2fa10 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
2fa20 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
2fa30 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
2fa40 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2fa50 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
2fa60 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
2fa70 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
2fa80 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
2fa90 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2faa0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2fab0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2fac0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2fad0 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
2fae0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
2faf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2fb00 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2fb10 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
2fb20 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb40 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
2fb50 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
2fb60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fb70 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2fb80 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
2fb90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
2fba0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2fbb0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2fbc0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
2fbd0 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
2fbe0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
2fbf0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
2fc00 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2fc10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2fc20 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2fc30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2fc40 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2fc50 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2fc60 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2fc70 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2fc80 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2fc90 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2fca0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2fcb0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2fcc0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2fcd0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2fce0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2fcf0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2fd00 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2fd10 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74  (i=0; i<nTabList
2fd20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76  ; i++){.    pLev
2fd30 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2fd40 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  i];.    explainO
2fd50 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
2fd60 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2fd70 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
2fd80 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
2fd90 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
2fda0 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2fdb0 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
2fdc0 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
2fdd0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2fde0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2fdf0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
2fe00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2fe10 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
2fe20 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2fe30 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
2fe40 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
2fe50 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
2fe60 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2fe70 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
2fe80 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
2fe90 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
2fea0 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
2feb0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
2fec0 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
2fed0 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
2fee0 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
2fef0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
2ff00 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
2ff10 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
2ff20 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
2ff30 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
2ff40 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
2ff50 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
2ff60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2ff70 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  abList; i++){.  
2ff80 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
2ff90 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
2ffa0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2ffb0 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
2ffc0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2ffd0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2ffe0 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
2fff0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
30000 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
30010 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
30020 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
30030 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
30040 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
30050 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
30060 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
30070 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
30080 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30090 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
300a0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Y ){.        mem
300b0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
300c0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
300d0 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20   "{}", 2);.     
300e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
300f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30100 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
30110 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
30120 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a  nQPlan], z, n);.
30130 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
30140 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
30150 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
30160 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
30170 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
30180 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
30190 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
301a0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
301b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
301c0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
301d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
301e0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
301f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
30200 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
30210 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
30220 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
30230 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
30240 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
30250 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
30260 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
30270 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
30280 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d  lse if( (pLevel-
30290 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
302a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
302b0 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  0 ){.      n = s
302c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
302d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
302e0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
302f0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
30300 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
30310 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
30320 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
30330 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
30340 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
30350 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
30360 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
30370 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
30380 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30390 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
303a0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
303b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
303c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
303d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
303e0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
303f0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
30400 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  an += 3;.    }. 
30410 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
30420 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
30430 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30440 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
30450 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
30460 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
30470 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
30480 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
30490 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
304a0 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
304b0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
304c0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
304d0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
304e0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
304f0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
30500 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
30510 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
30520 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
30530 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
30540 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  rn..  */.  retur
30550 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
30560 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
30570 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
30580 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
30590 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
305a0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
305b0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
305c0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
305d0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
305e0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
305f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
30600 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
30610 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30620 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
30630 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
30640 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30650 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
30660 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
30670 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30680 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
30690 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
306a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
306b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
306c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
306d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
306e0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
306f0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
30700 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
30710 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
30720 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
30730 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
30740 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
30750 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
30760 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
30770 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30780 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
30790 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
307a0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
307b0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
307c0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
307d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
307e0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
307f0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
30800 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
30810 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
30820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30830 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
30840 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
30850 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
30860 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30870 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
30880 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
30890 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
308a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
308b0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
308c0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
308d0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
308e0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
308f0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
30900 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30910 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
30920 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
30930 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
30940 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
30950 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
30960 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
30970 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
30980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30990 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
309a0 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
309b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
309c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
309d0 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
309e0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
309f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30a00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
30a10 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
30a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30a40 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
30a50 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
30a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30a70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
30a80 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
30a90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30aa0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
30ab0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
30ac0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
30ad0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30ae0 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
30af0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
30b00 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
30b10 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30b20 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30b30 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
30b40 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   || (pLevel->pla
30b50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
30b60 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
30b70 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
30b80 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30b90 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30ba0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
30bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30bc0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
30bd0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
30be0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
30bf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
30c00 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
30c10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30c20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30c30 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
30c40 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
30c50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30c60 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
30c70 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
30c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30c90 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30ca0 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
30cb0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30cd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30ce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
30cf0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
30d00 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
30d10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
30d20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
30d30 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
30d40 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
30d50 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
30d60 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
30d70 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
30d80 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
30d90 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
30da0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30db0 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
30dc0 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
30dd0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
30de0 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
30df0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
30e00 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
30e10 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
30e20 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20  o->nLevel==1 || 
30e30 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
30e40 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
30e50 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
30e60 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
30e70 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
30e80 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
30e90 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
30ea0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
30eb0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
30ec0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
30ed0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
30ee0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
30ef0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
30f00 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
30f10 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
30f20 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
30f30 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
30f40 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
30f50 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
30f60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30f70 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
30f80 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  SE)==0.    ){.  
30f90 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 65      int ws = pLe
30fa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
30fb0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  s;.      if( !pW
30fc0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
30fd0 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  && (ws & WHERE_I
30fe0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
30ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31000 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
31010 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
31020 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
31030 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20  }.      if( (ws 
31040 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
31050 21 3d 30 20 26 26 20 28 77 73 20 26 20 57 48 45  !=0 && (ws & WHE
31060 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d  RE_TEMP_INDEX)==
31070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
31080 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31090 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76  , OP_Close, pLev
310a0 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
310b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
310c0 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e   /* If this scan
310d0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20   uses an index, 
310e0 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69  make code substi
310f0 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
31100 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
31110 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72   the index in pr
31120 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
31130 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73  table. Sometimes
31140 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  , this means.   
31150 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65   ** the table ne
31160 65 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ed never be read
31170 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61   from. This is a
31180 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
31190 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  st,.    ** as th
311a0 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69  e vdbe level wai
311b0 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62  ts until the tab
311c0 6c 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72  le is read befor
311d0 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  e actually.    *
311e0 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61  * seeking the ta
311f0 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ble cursor to th
31200 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70  e record corresp
31210 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75  onding to the cu
31220 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73  rrent.    ** pos
31230 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64  ition in the ind
31240 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ex..    ** .    
31250 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20  ** Calls to the 
31260 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
31270 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65  n between sqlite
31280 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a  3WhereBegin and.
31290 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68      ** sqlite3Wh
312a0 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65  ereEnd will have
312b0 20 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68   created code th
312c0 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
312d0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64  e table.    ** d
312e0 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c  irectly.  This l
312f0 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68  oop scans all th
31300 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20  at code looking 
31310 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20  for opcodes.    
31320 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ** that referenc
31330 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  e the table and 
31340 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e  converts them in
31350 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a  to opcodes that.
31360 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
31370 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
31380 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  */.    if( (pLev
31390 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
313a0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
313b0 29 21 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  )!=0 && !db->mal
313c0 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20  locFailed){.    
313d0 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74    int k, j, last
313e0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
313f0 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  pOp;.      Index
31400 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d   *pIdx = pLevel-
31410 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20  >plan.u.pIdx;.. 
31420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
31430 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
31440 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
31450 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
31460 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
31470 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
31480 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
31490 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
314a0 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
314b0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
314c0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
314d0 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
314e0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
314f0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
31500 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
31510 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
31520 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
31530 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
31540 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
31550 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
31560 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
31570 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
31580 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
31590 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
315a0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
315b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
315c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
315d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
315e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
315f0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
31600 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
31610 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
31620 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
31630 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
31640 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
31650 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
31660 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
31670 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
31680 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
31690 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
316a0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
316b0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
316c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
316d0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
316e0 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50  leanup.  */.  pP
316f0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
31700 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64   = pWInfo->saved
31710 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68  NQueryLoop;.  wh
31720 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
31730 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
31740 6e 3b 0a 7d 0a                                   n;.}.