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

Artifact 13e6e3e15bd2b2991e73027cd23e584bf7a629ad:


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 70 49 64 78 20 26        if( pIdx &
5ad0: 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
5ae0: 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  or!=WO_ISNULL ){
5af0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
5b00: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
5b10: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  pr;.          Co
5b20: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
5b30: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
5b40: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69  aff;.          i
5b50: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
5b60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5b70: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 0a  pWC->pParse;.  .
5b80: 20 20 20 20 20 20 20 20 20 20 69 64 78 61 66 66            idxaff
5b90: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
5ba0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
5bb0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
5bc0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
5bd0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
5be0: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
5bf0: 74 69 6e 75 65 3b 0a 20 20 0a 20 20 20 20 20 20  tinue;.  .      
5c00: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
5c10: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
5c20: 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65  sequence require
5c30: 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20  d from an index 
5c40: 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  for.          **
5c50: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
5c60: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
5c70: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
5c80: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
5c90: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20      ** value in 
5ca0: 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a  variable pColl..
5cb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
5cc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
5cd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
5ce0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
5cf0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
5d00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5d10: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
5d20: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
5d30: 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c    assert(pColl |
5d40: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b  | pParse->nErr);
5d50: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f  .  .          fo
5d60: 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43  r(j=0; pIdx->aiC
5d70: 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d  olumn[j]!=iColum
5d80: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
5d90: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
5da0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
5db0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5dd0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
5de0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5df0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
5e00: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20  x->azColl[j]) ) 
5e10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
5e30: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
5e40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5e50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5e60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5e80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5e90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
5ea0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
5eb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
5ec0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5ed0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5ee0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5ef0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5f00: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5f10: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5f20: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5f30: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5f40: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5f50: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5f60: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5f70: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5f80: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5f90: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
5fa0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
5fb0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
5fc0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
5fd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5fe0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5ff0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
6000: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6010: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6020: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
6030: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
6040: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
6050: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
6060: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
6070: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
6080: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
6090: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
60a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
60b0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
60c0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
60d0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
60e0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
60f0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
6100: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
6110: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
6120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
6130: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
6140: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6150: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
6160: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
6170: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
6180: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
6190: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
61a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
61b0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
61c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
61d0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
61e0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
61f0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
6200: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
6210: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
6220: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
6230: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
6240: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
6250: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
6260: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
6270: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
6280: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
6290: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
62a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
62b0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
62c0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
62d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
62e0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
62f0: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
6300: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
6310: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
6320: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
6330: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
6340: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
6350: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
6360: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
6390: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
63a0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
63b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
63c0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
63d0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
63e0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
63f0: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
6400: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
6410: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
6420: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6430: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
6440: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6450: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
6460: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
6470: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6490: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
64a0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
64b0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
64c0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
64d0: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
64e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
64f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
6500: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
6510: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
6520: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
6530: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6540: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
6550: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
6560: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
6570: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69  K_COLUMN || sqli
6580: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
6590: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
65a0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
65b0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
65c0: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
65d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
65e0: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
65f0: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
6600: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
6610: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
6620: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
6630: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
6640: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
6650: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
6660: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
6670: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
6680: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
6690: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
66a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
66b0: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
66c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
66d0: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
66e0: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
66f0: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
6700: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6710: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
6720: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
6730: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
6740: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
6750: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
6760: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
6770: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
6780: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
6790: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
67a0: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
67b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
67c0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
67d0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
67e0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
67f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
6800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6810: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
6820: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
6830: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73  , iCol);.    ass
6840: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
6850: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20  =TK_VARIABLE || 
6860: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52  pRight->op==TK_R
6870: 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c  EGISTER );.  }el
6880: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54  se if( op==TK_ST
6890: 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20  RING ){.    z = 
68a0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
68b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b  ;.  }.  if( z ){
68c0: 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  .    cnt = 0;.  
68d0: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e    while( (c=z[cn
68e0: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
68f0: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
6900: 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20  & c!=wc[2] ){.  
6910: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
6920: 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20  .    if( cnt!=0 
6930: 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e  && 255!=(u8)z[cn
6940: 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78  t-1] ){.      Ex
6950: 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20  pr *pPrefix;.   
6960: 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20     *pisComplete 
6970: 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  = c==wc[0] && z[
6980: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20  cnt+1]==0;.     
6990: 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74   pPrefix = sqlit
69a0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
69b0: 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20  RING, z);.      
69c0: 69 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50  if( pPrefix ) pP
69d0: 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  refix->u.zToken[
69e0: 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cnt] = 0;.      
69f0: 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65  *ppPrefix = pPre
6a00: 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  fix;.      if( o
6a10: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
6a20: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
6a30: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6a40: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
6a50: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
6a60: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
6a70: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
6a80: 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26  ( *pisComplete &
6a90: 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  & pRight->u.zTok
6aa0: 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  en[1] ){.       
6ab0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73     /* If the rhs
6ac0: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70   of the LIKE exp
6ad0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72  ression is a var
6ae0: 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63  iable, and the c
6af0: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
6b00: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65   ** value of the
6b10: 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20   variable means 
6b20: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
6b30: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c   to invoke the L
6b40: 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  IKE.          **
6b50: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
6b60: 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77  no OP_Variable w
6b70: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
6b80: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
6b90: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
6ba0: 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66  auses problems f
6bb0: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
6bc0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
6bd0: 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  me().          *
6be0: 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72  * API. To workar
6bf0: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
6c00: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
6c10: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
6c20: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
6c30: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
6c40: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6c50: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
6c60: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
6c70: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
6c80: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
6c90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6ca0: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
6cb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6cc0: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
6cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6ce0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6cf0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
6d00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6d10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
6d20: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
6d30: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6d40: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
6d50: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
6d60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6d70: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
6d80: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
6d90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6da0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
6db0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6dc0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
6dd0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
6de0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
6df0: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
6e00: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
6e10: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
6e20: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
6e30: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
6e40: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
6e50: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
6e60: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
6e70: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
6e80: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
6e90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
6ea0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6eb0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6ec0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6ed0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6ee0: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
6ef0: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
6f00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6f10: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
6f20: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6f30: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
6f40: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
6f50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6f60: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
6f70: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
6f80: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
6f90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6fa0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6fb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6fc0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6fd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
6fe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
6ff0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
7000: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
7010: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
7020: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
7030: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
7040: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
7050: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
7060: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
7070: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
7080: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
7090: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
70a0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
70b0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
70c0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
70d0: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
70e0: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
70f0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
7100: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
7110: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
7120: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
7130: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7140: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7150: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
7160: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
7170: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
7180: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
7190: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
71a0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
71b0: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
71c0: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
71d0: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
71e0: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
7200: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
7210: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
7220: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
7230: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
7240: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
7250: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
7260: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
7270: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
7280: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
7290: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
72a0: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
72b0: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
72c0: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
72d0: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
72e0: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
72f0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
7300: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
7310: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
7320: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
7330: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
7340: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
7350: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
7360: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
7370: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
7380: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
7390: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
73a0: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
73b0: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
73c0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
73d0: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
73e0: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
73f0: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
7400: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
7410: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
7420: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
7430: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
7440: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
7450: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
7460: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7470: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
7480: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
7490: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
74a0: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
74b0: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
74c0: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
74d0: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
74e0: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
74f0: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
7500: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
7510: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
7520: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
7530: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
7540: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
7550: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
7560: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
7570: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
7580: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
7590: 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73  lumn of C.** a s
75a0: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
75b0: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
75c0: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
75d0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
75e0: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
75f0: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
7600: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
7610: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
7620: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
7630: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
7640: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
7650: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
7660: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
7670: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
7680: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
7690: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
76a0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
76b0: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
76c0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
76d0: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
76e0: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
76f0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
7700: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
7710: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
7720: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7730: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
7740: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
7750: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
7760: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
7770: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
7780: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
7790: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
77a0: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
77b0: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
77c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
77d0: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
77e0: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
77f0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
7800: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
7810: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
7820: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
7830: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
7840: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
7850: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
7860: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
7870: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
7880: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
7890: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
78a0: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
78b0: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
78c0: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
78d0: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
78e0: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
78f0: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
7900: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
7910: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
7920: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
7930: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
7940: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
7950: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
7960: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
7970: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
7980: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
7990: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
79a0: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
79b0: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
79c0: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
79d0: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
79e0: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
79f0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
7a00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
7a10: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
7a20: 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69  at.** is somethi
7a30: 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  ng the bestIndex
7a40: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
7a50: 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73  determine.  This
7a60: 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c   analysis.** onl
7a70: 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68  y looks at wheth
7a80: 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72  er subterms appr
7a90: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
7aa0: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
7ab0: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
7ac0: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
7ad0: 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73   all satisfy cas
7ae0: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
7af0: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
7b00: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
7b10: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
7b20: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
7b30: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
7b40: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
7b50: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
7b60: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
7b70: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
7b80: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
7b90: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
7ba0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
7bb0: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
7bc0: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
7bd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
7be0: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
7bf0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
7c00: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
7c10: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
7c20: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
7c30: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
7c40: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
7c50: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
7c60: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
7c70: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
7c80: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
7c90: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
7ca0: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
7cb0: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
7cc0: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
7cd0: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
7ce0: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
7cf0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
7d00: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
7d10: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
7d20: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
7d30: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
7d40: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
7d50: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7d60: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
7d70: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
7d80: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7da0: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
7db0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
7dc0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
7dd0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7de0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7df0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
7e00: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
7e10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
7e20: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7e40: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
7e50: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7e60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65  ed */.){.  Parse
7e70: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
7e80: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7e90: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7ea0: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
7eb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7ec0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7ed0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7ee0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
7ef0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
7f00: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7f10: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
7f20: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7f30: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
7f40: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f60: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7f70: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
7f80: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
7f90: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
7fa0: 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c  MaskSet; /* Tabl
7fb0: 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  e use masks */. 
7fc0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7ff0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
8000: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
8010: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
8020: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
8030: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
8040: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
8050: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
8060: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
8070: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
8080: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
8090: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
80a0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
80b0: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
80c0: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
80d0: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
80e0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
80f0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
8100: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
8110: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
8120: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
8130: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
8140: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
8150: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
8160: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
8170: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
8180: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
8190: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
81a0: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
81b0: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
81c0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
81d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
81e0: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
81f0: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
8200: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
8210: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
8220: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
8230: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
8240: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
8250: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
8260: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
8270: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
8280: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8290: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
82a0: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
82b0: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
82c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
82d0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
82e0: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
82f0: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
8300: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
8310: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
8320: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
8330: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
8340: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
8350: 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  rWc, pWC->pParse
8360: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
8370: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
8380: 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63  whereSplit(pOrWc
8390: 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b  , pExpr, TK_OR);
83a0: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
83b0: 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a  l(pSrc, pOrWc);.
83c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
83d0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
83e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63  .  assert( pOrWc
83f0: 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20  ->nTerm>=2 );.. 
8400: 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65   /*.  ** Compute
8410: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
8420: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
8430: 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72  tisfy cases 1 or
8440: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78   2..  */.  index
8450: 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b  able = ~(Bitmask
8460: 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d  )0;.  chngToIN =
8470: 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a   ~(pWC->vmask);.
8480: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8490: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
84a0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26  pOrWc->a; i>=0 &
84b0: 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d  & indexable; i--
84c0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
84d0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
84e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53  eOperator & WO_S
84f0: 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  INGLE)==0 ){.   
8500: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
8510: 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20  *pAndInfo;.     
8520: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8530: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29  ->eOperator==0 )
8540: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8550: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
8560: 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46  s & (TERM_ANDINF
8570: 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d  O|TERM_ORINFO))=
8580: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67  =0 );.      chng
8590: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
85a0: 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pAndInfo = sqlit
85b0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
85c0: 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e  , sizeof(*pAndIn
85d0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
85e0: 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pAndInfo ){.    
85f0: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
8600: 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20  *pAndWC;.       
8610: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64   WhereTerm *pAnd
8620: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
8630: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74  t j;.        Bit
8640: 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20  mask b = 0;.    
8650: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70      pOrTerm->u.p
8660: 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e  AndInfo = pAndIn
8670: 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  fo;.        pOrT
8680: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
8690: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20  TERM_ANDINFO;.  
86a0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65        pOrTerm->e
86b0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e  Operator = WO_AN
86c0: 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57  D;.        pAndW
86d0: 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77  C = &pAndInfo->w
86e0: 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  c;.        where
86f0: 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57  ClauseInit(pAndW
8700: 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  C, pWC->pParse, 
8710: 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d 3e 77  pMaskSet, pWC->w
8720: 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
8730: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
8740: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
8750: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
8760: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
8770: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
8780: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41  dWC);.        pA
8790: 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70  ndWC->pOuter = p
87a0: 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  WC;.        test
87b0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
87c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
87d0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
87e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
87f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
8800: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
8810: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
8820: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
8830: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
8840: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
8850: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
8860: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
8870: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
8880: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
8890: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
88a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
88b0: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
88c0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
88d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
88e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
88f0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
8900: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
8910: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
8920: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8930: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
8940: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
8950: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
8960: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
8970: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
8980: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
8990: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
89a0: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
89b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
89c0: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
89d0: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
89e0: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
89f0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8a00: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
8a10: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8a20: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
8a30: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
8a40: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
8a50: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
8a60: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
8a70: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
8a80: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
8a90: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
8aa0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
8ab0: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   b;.      if( pO
8ac0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8ad0: 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  !=WO_EQ ){.     
8ae0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
8af0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8b00: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
8b10: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8b20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
8b30: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
8b40: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
8b50: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
8b60: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
8b70: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
8b80: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
8b90: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
8ba0: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
8bb0: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
8bc0: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
8bd0: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
8be0: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
8bf0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
8c00: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
8c10: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
8c20: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
8c30: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
8c40: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
8c50: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
8c60: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
8c70: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
8c80: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
8c90: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
8ca0: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
8cb0: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
8cc0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
8cd0: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
8ce0: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
8cf0: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
8d00: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
8d10: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
8d20: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
8d30: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
8d40: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
8d50: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
8d60: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
8d70: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
8d80: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
8d90: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
8da0: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
8db0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
8dc0: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
8dd0: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
8de0: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
8df0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
8e00: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
8e10: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
8e20: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
8e30: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
8e40: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
8e50: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
8e60: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
8e70: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
8e80: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
8e90: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
8ea0: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
8eb0: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
8ec0: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
8ed0: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
8ee0: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
8ef0: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
8f00: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
8f10: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
8f20: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8f30: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8f40: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8f50: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
8f60: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
8f70: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
8f80: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
8f90: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
8fa0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
8fb0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8fc0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
8fd0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
8fe0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
8ff0: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
9000: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
9010: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
9020: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
9030: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
9040: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
9050: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
9060: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
9070: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
9080: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
9090: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
90a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
90b0: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
90c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
90d0: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
90e0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
90f0: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
9100: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
9110: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
9120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9130: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
9140: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
9150: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
9160: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
9170: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
9180: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
9190: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
91a0: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
91b0: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
91c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
91d0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
91e0: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
91f0: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
9200: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
9210: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
9220: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
9230: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
9240: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
9250: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
9260: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
9270: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
9280: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
9290: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
92a0: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
92b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
92c0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
92d0: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
92e0: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
92f0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
9300: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
9310: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9320: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9330: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
9340: 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  tor==WO_EQ );.  
9350: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
9360: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
9370: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  OR_OK;.        i
9380: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
9390: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
93a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
93b0: 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69  This is the 2-bi
93c0: 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72  t case and we ar
93d0: 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  e on the second 
93e0: 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20  iteration and.  
93f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
9400: 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20  nt term is from 
9410: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
9420: 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68  ion.  So skip th
9430: 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  is term. */.    
9440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
9450: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
9460: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9470: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
9480: 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d  (chngToIN & getM
9490: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
94a0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
94b0: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
94c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
94d0: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
94e0: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
94f0: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
9500: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
9510: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
9520: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
9530: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
9540: 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a  ither preceeded.
9550: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
9560: 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e  follwed by an in
9570: 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e  verted copy (t2.
9580: 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20  b==t1.a).  Skip 
9590: 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20  this term .     
95a0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20       ** and use 
95b0: 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a  its inversion. *
95c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
95d0: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
95e0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
95f0: 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  PIED );.        
9600: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
9610: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
9620: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
9630: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9640: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9650: 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44  s & (TERM_COPIED
9660: 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
9670: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
9680: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
9690: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
96a0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
96b0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
96c0: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
96d0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
96e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
96f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9700: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
9710: 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20  /* No candidate 
9720: 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73  table+column was
9730: 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61   found.  This ca
9740: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20  n only occur.   
9750: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73       ** on the s
9760: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
9770: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
9780: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
9790: 20 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67     assert( (chng
97a0: 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31  ToIN&(chngToIN-1
97b0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))==0 );.       
97c0: 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49   assert( chngToI
97d0: 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  N==getMask(pMask
97e0: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
97f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
9810: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
9820: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
9830: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
9840: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
9850: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
9860: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
9870: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
9880: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
9890: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
98a0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
98b0: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
98c0: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
98d0: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
98e0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
98f0: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
9900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9910: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
9920: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
9930: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
9940: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
9950: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
9960: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9970: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
9980: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9990: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
99a0: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
99b0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
99c0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
99d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
99e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
99f0: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
9a00: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
9a10: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
9a20: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
9a30: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
9a40: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
9a50: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
9a60: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
9a70: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
9a80: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
9a90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
9aa0: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
9ab0: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
9ac0: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
9ad0: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
9ae0: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
9af0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
9b00: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
9b10: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
9b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
9b30: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
9b40: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
9b50: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
9b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9b70: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
9b80: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
9b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9ba0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
9bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9bc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
9bd0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9be0: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
9bf0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9c00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9c10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
9c20: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
9c30: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
9c40: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
9c50: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
9c60: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
9c70: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
9c80: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
9c90: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
9ca0: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
9cb0: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
9cc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
9cd0: 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30  *.    ** EV: R-0
9ce0: 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a  0211-15100.    *
9cf0: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
9d00: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
9d10: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
9d20: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
9d30: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
9d40: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9d50: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
9d60: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
9d70: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
9d80: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9d90: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9da0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
9db0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
9dc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9dd0: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9de0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9df0: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
9e00: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
9e10: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9e20: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
9e30: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
9e40: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9e50: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
9e60: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9e70: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
9e80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
9e90: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
9ea0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
9eb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9ec0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
9ed0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
9ee0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9ef0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
9f00: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
9f10: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
9f20: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
9f30: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9f40: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
9f50: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
9f60: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9f70: 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70  istAppend(pWC->p
9f80: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44  Parse, pList, pD
9f90: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  up);.        pLe
9fa0: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
9fb0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
9fc0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
9fd0: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
9fe0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
9ff0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
a000: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
a010: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
a020: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
a030: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
a040: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a050: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
a060: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
a070: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
a080: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
a090: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
a0c0: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
a0d0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
a0e0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
a0f0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
a100: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
a110: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
a120: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
a130: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a140: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
a150: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
a160: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
a170: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
a180: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a190: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
a1a0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
a1b0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
a1c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
a1d0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
a1e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a1f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
a200: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
a210: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
a220: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
a230: 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20  ator = WO_NOOP; 
a240: 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70   /* case 1 trump
a250: 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20  s case 2 */.    
a260: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
a270: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  * !SQLITE_OMIT_O
a280: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26  R_OPTIMIZATION &
a290: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  & !SQLITE_OMIT_S
a2a0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a  UBQUERY */.../*.
a2b0: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
a2c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a2d0: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
a2e0: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
a2f0: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
a300: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
a310: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
a320: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
a330: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
a340: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
a350: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
a360: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
a370: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
a380: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
a390: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
a3a0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
a3b0: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
a3c0: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
a3d0: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
a3e0: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
a3f0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
a400: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a410: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
a420: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
a430: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
a440: 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f   and Y are.** co
a450: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  lumns, then the 
a460: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
a470: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
a480: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
a490: 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68  al.** term of th
a4a0: 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58  e form "Y <op> X
a4b0: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
a4c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
a4d0: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73  nd.** analyzed s
a4e0: 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20  eparately.  The 
a4f0: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73  original term is
a500: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
a510: 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20  M_COPIED.** and 
a520: 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20  the new term is 
a530: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
a540: 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73  _DYNAMIC (becaus
a550: 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20  e it's pExpr.** 
a560: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
a570: 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65  d with the Where
a580: 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d  Clause) and TERM
a590: 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73  _VIRTUAL (becaus
a5a0: 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d  e it.** is a com
a5b0: 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20  muted copy of a 
a5c0: 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68  prior term.)  Th
a5d0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a5e0: 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20  has nChild=1.** 
a5f0: 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73  and the copy has
a600: 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74   idxParent set t
a610: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
a620: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
a630: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a640: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
a650: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
a660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
a670: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
a680: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
a690: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
a6a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a6b0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6d0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
a6e0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
a6f0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
a700: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
a710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a720: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
a730: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
a740: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
a750: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
a760: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
a770: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
a780: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a7b0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
a7c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
a7d0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
a7e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
a7f0: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
a800: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
a810: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
a820: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a830: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
a840: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
a850: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
a860: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
a870: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
a880: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
a890: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
a8a0: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
a8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
a8c0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
a8d0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
a8e0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a900: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
a910: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
a920: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
a930: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
a940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b            /* LIK
a950: 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69  E/GLOB distingui
a960: 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69  shes case */.  i
a970: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
a9a0: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
a9b0: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
a9c0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
a9d0: 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se;     /* Parsi
a9e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a9f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
aa00: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
aa10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
aa20: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
aa30: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
aa40: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
aa50: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
aa60: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
aa70: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70  ;.  pMaskSet = p
aa80: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
aa90: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
aaa0: 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65  Expr;.  prereqLe
aab0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
aac0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
aad0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
aae0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
aaf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
ab00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
ab10: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
ab20: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
ab30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ab40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
ab50: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
ab60: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
ab70: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
ab80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ab90: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
aba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
abb0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
abc0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
abd0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
abe0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
abf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
ac00: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
ac10: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
ac20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
ac30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ac40: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ac50: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
ac60: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ac70: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
ac80: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
ac90: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
aca0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
acb0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
acc0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
acd0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
ace0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
acf0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
ad00: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
ad10: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
ad20: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
ad30: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
ad40: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
ad50: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
ad60: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
ad70: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
ad80: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
ad90: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
ada0: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
adb0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
adc0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
add0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
ade0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
adf0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
ae00: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
ae10: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
ae20: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
ae30: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26  allowedOp(op) &&
ae40: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
ae50: 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66  ight & prereqLef
ae60: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  t)==0 ){.    Exp
ae70: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
ae80: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70  ->pLeft;.    Exp
ae90: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
aea0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
aeb0: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
aec0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
aed0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
aee0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
aef0: 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  le;.      pTerm-
af00: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
af10: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
af20: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
af30: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
af40: 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d  rMask(op);.    }
af50: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
af60: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
af70: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
af80: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
af90: 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
afa0: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
afb0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
afc0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
afd0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
afe0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
aff0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
b000: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
b010: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b020: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
b030: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
b040: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
b050: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
b060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b070: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
b080: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b090: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
b0a0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
b0b0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
b0c0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
b0d0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
b0e0: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
b0f0: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
b100: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
b110: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
b120: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b130: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
b140: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
b150: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
b160: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
b170: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
b180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
b190: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
b1a0: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
b1b0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
b1c0: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61   exprCommute(pPa
b1d0: 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  rse, pDup);.    
b1e0: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
b1f0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
b200: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
b210: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
b220: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
b230: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
b240: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b250: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
b260: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
b270: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
b280: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
b290: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
b2a0: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
b2b0: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
b2c0: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
b2d0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
b2e0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
b2f0: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
b300: 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d  pDup->op);.    }
b310: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
b320: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
b330: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  N_OPTIMIZATION. 
b340: 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73   /* If a term is
b350: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
b360: 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77  rator, create tw
b370: 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  o new virtual te
b380: 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65  rms.  ** that de
b390: 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74  fine the range t
b3a0: 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20  hat the BETWEEN 
b3b0: 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72  implements.  For
b3c0: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
b3d0: 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45   **      a BETWE
b3e0: 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a  EN b AND c.  **.
b3f0: 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65    ** is converte
b400: 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
b410: 2a 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45  *      (a BETWEE
b420: 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28  N b AND c) AND (
b430: 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29  a>=b) AND (a<=c)
b440: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74  .  **.  ** The t
b450: 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65  wo new terms are
b460: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
b470: 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65  end of the Where
b480: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20  Clause object.. 
b490: 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d   ** The new term
b4a0: 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20  s are "dynamic" 
b4b0: 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e  and are children
b4c0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b4d0: 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65   BETWEEN.  ** te
b4e0: 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  rm.  That means 
b4f0: 74 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57  that if the BETW
b500: 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65  EEN term is code
b510: 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  d, the children 
b520: 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64  are.  ** skipped
b530: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68  .  Or, if the ch
b540: 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73  ildren are satis
b550: 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  fied by an index
b560: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  , the original. 
b570: 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d   ** BETWEEN term
b580: 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   is skipped..  *
b590: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b5a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
b5b0: 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54  EN && pWC->op==T
b5c0: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70  K_AND ){.    Exp
b5d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
b5e0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
b5f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
b600: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
b610: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
b620: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
b630: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
b640: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
b650: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
b660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
b670: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b680: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
b690: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b6a0: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
b6b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b6c0: 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20  e, ops[i], .    
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b6f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b700: 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20  r->pLeft, 0),.  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b730: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
b740: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
b750: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
b760: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
b770: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
b780: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
b790: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
b7a0: 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
b7b0: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
b7c0: 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c  ;.      exprAnal
b7d0: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
b7e0: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54  dxNew);.      pT
b7f0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
b800: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57  xTerm];.      pW
b810: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61  C->a[idxNew].iPa
b820: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b830: 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d      }.    pTerm-
b840: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d  >nChild = 2;.  }
b850: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b860: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
b870: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
b880: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b890: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b8a0: 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65  MIZATION) && !de
b8b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8c0: 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a  T_SUBQUERY).  /*
b8d0: 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20   Analyze a term 
b8e0: 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64  that is composed
b8f0: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
b900: 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  subterms connect
b910: 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52  ed by.  ** an OR
b920: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
b930: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
b940: 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20  ->op==TK_OR ){. 
b950: 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e     assert( pWC->
b960: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
b970: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54    exprAnalyzeOrT
b980: 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69  erm(pSrc, pWC, i
b990: 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65  dxTerm);.    pTe
b9a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b9b0: 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Term];.  }.#endi
b9c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b9d0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
b9e0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b9f0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
ba00: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
ba10: 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  Add constraints 
ba20: 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65  to reduce the se
ba30: 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20  arch space on a 
ba40: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a  LIKE or GLOB.  *
ba50: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a  * operator..  **
ba60: 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74  .  ** A like pat
ba70: 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  tern of the form
ba80: 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22   "x LIKE 'abc%'"
ba90: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f   is changed into
baa0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
bab0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
bac0: 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27  x>='abc' AND x<'
bad0: 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20  abd' AND x LIKE 
bae0: 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a  'abc%'.  **.  **
baf0: 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   The last charac
bb00: 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69  ter of the prefi
bb10: 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65  x "abc" is incre
bb20: 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74  mented to form t
bb30: 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74  he.  ** terminat
bb40: 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61  ion condition "a
bb50: 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  bd"..  */.  if( 
bb60: 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  pWC->op==TK_AND 
bb70: 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47  .   && isLikeOrG
bb80: 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70  lob(pParse, pExp
bb90: 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f  r, &pStr1, &isCo
bba0: 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29  mplete, &noCase)
bbb0: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
bbc0: 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  pLeft;       /* 
bbd0: 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  LHS of LIKE/GLOB
bbe0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
bbf0: 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20   Expr *pStr2;   
bc00: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
bc10: 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49  Str1 - RHS of LI
bc20: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
bc30: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   */.    Expr *pN
bc40: 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70  ewExpr1;.    Exp
bc50: 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  r *pNewExpr2;.  
bc60: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20    int idxNew1;. 
bc70: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a     int idxNew2;.
bc80: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
bc90: 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ll;    /* Collat
bca0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
bcb0: 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  use */..    pLef
bcc0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
bcd0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
bce0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
bcf0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bd00: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
bd10: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
bd20: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
bd30: 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
bd40: 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
bd50: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
bd60: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
bd70: 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
bd80: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
bd90: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
bda0: 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
bdb0: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
bdc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
bdd0: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
bde0: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
bdf0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
be00: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
be10: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
be20: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
be30: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
be40: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
be50: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
be60: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
be70: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
be80: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
be90: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
bea0: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
beb0: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
bec0: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
bed0: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
bee0: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
bef0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
bf00: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
bf10: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
bf20: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
bf30: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
bf40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bf50: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
bf60: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
bf70: 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34  0;   /* EV: R-64
bf80: 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20  339-08207 */... 
bf90: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
bfa0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
bfb0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
bfc0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
bfd0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
bfe0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
bff0: 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
c000: 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f  F8, noCase ? "NO
c010: 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22  CASE" : "BINARY"
c020: 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  ,0);.    pNewExp
c030: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
c040: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c  r(pParse, TK_GE,
c050: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c070: 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65  prSetColl(sqlite
c080: 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66  3ExprDup(db,pLef
c090: 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20  t,0), pColl),.  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20     pStr1, 0);.  
c0c0: 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72    idxNew1 = wher
c0d0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c0e0: 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45  C, pNewExpr1, TE
c0f0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
c100: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65  DYNAMIC);.    te
c110: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d  stcase( idxNew1=
c120: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
c130: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
c140: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
c150: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
c160: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
c170: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
c180: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c190: 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73  te3ExprSetColl(s
c1a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c1b0: 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c  ,pLeft,0), pColl
c1c0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c1d0: 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30          pStr2, 0
c1e0: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d  );.    idxNew2 =
c1f0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
c200: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
c210: 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  2, TERM_VIRTUAL|
c220: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
c230: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c240: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65  New2==0 );.    e
c250: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
c260: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a   pWC, idxNew2);.
c270: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c280: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c290: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65    if( isComplete
c2a0: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61   ){.      pWC->a
c2b0: 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e  [idxNew1].iParen
c2c0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c2d0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
c2e0: 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  2].iParent = idx
c2f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
c300: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
c310: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c320: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
c330: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
c340: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
c350: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c360: 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61  TABLE.  /* Add a
c370: 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69   WO_MATCH auxili
c380: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20  ary term to the 
c390: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69  constraint set i
c3a0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
c3b0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  nt expression is
c3c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63   of the form:  c
c3d0: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
c3e0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f  ..  ** This info
c3f0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
c400: 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
c410: 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a  x methods of.  *
c420: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * virtual tables
c430: 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75  .  The native qu
c440: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f  ery optimizer do
c450: 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20  es not attempt. 
c460: 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69   ** to do anythi
c470: 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75  ng with MATCH fu
c480: 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
c490: 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  if( isMatchOfCol
c4a0: 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  umn(pExpr) ){.  
c4b0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
c4c0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
c4d0: 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72  *pLeft;.    Wher
c4e0: 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b  eTerm *pNewTerm;
c4f0: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65  .    Bitmask pre
c500: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65  reqColumn, prere
c510: 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67  qExpr;..    pRig
c520: 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
c530: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c540: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c550: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c560: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65  ].pExpr;.    pre
c570: 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61  reqExpr = exprTa
c580: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
c590: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
c5a0: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65  prereqColumn = e
c5b0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
c5c0: 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a  askSet, pLeft);.
c5d0: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45      if( (prereqE
c5e0: 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75  xpr & prereqColu
c5f0: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
c600: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
c610: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
c620: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c630: 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20  arse, TK_MATCH, 
c640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c660: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
c670: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c  (db, pRight, 0),
c680: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
c690: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
c6a0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
c6b0: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
c6c0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
c6d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c6e0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
c6f0: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c700: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c710: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c720: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
c730: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20  ereqExpr;.      
c740: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
c750: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c760: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c770: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
c780: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
c790: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
c7a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c7b0: 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20   WO_MATCH;.     
c7c0: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
c7d0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
c7e0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c7f0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c800: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c810: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
c820: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c830: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
c840: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c850: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
c860: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
c870: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
c880: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
c890: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
c8a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c8b0: 53 54 41 54 33 0a 20 20 2f 2a 20 57 68 65 6e 20  STAT3.  /* When 
c8c0: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
c8d0: 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
c8e0: 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72  vailable an oper
c8f0: 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ator of the.  **
c900: 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20   form "x IS NOT 
c910: 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69  NULL" can someti
c920: 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64  mes be evaluated
c930: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
c940: 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c  y.  ** as "x>NUL
c950: 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61  L" if x is not a
c960: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
c970: 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74  Y KEY.  So const
c980: 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74  ruct a.  ** virt
c990: 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74  ual term of that
c9a0: 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   form..  **.  **
c9b0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76   Note that the v
c9c0: 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74  irtual term must
c9d0: 20 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20   be tagged with 
c9e0: 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69  TERM_VNULL.  Thi
c9f0: 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c  s.  ** TERM_VNUL
ca00: 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72  L tag will suppr
ca10: 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ess the not-null
ca20: 20 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65   check at the be
ca30: 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20  ginning.  ** of 
ca40: 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f  the loop.  Witho
ca50: 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c  ut the TERM_VNUL
ca60: 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d  L flag, the not-
ca70: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20  null check at.  
ca80: 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
ca90: 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72  the loop will pr
caa0: 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74  event any result
cab0: 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74  s from being ret
cac0: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  urned..  */.  if
cad0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
cae0: 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45  NOTNULL.   && pE
caf0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
cb00: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
cb10: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43  pExpr->pLeft->iC
cb20: 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20  olumn>=0.  ){.  
cb30: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
cb40: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  ;.    Expr *pLef
cb50: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
cb60: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
cb70: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
cb80: 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20  *pNewTerm;..    
cb90: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
cba0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
cbb0: 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_GT,.         
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
cbe0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c  p(db, pLeft, 0),
cbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
cc10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cc20: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
cc30: 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64   0), 0);..    id
cc40: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
cc50: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
cc60: 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  ewExpr,.        
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55        TERM_VIRTU
cc90: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c  AL|TERM_DYNAMIC|
cca0: 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20  TERM_VNULL);.   
ccb0: 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20   if( idxNew ){. 
ccc0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20       pNewTerm = 
ccd0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
cce0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
ccf0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
cd00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cd10: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
cd20: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
cd30: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
cd40: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
cd50: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
cd60: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
cd70: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a  erator = WO_GT;.
cd80: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
cd90: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
cda0: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
cdb0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
cdc0: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
cdd0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
cde0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
cdf0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ce00: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
ce10: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
ce20: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
ce30: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
ce40: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ce50: 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a 20 50  _STAT */..  /* P
ce60: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
ce70: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
ce80: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
ce90: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
cea0: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
ceb0: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
cec0: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
ced0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
cee0: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
cef0: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
cf00: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cf10: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
cf20: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
cf30: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
cf40: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
cf50: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
cf60: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
cf70: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
cf80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cf90: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
cfa0: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
cfb0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
cfc0: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
cfd0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
cfe0: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
cff0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
d000: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
d010: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
d020: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
d030: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
d040: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
d050: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
d060: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
d070: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
d0a0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
d0b0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
d0c0: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
d0d0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
d0e0: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
d0f0: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
d100: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
d110: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
d120: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
d130: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
d140: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
d150: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d160: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
d170: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d180: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d190: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
d1a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
d1b0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d1c0: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
d1d0: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
d1e0: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
d1f0: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
d200: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
d210: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
d220: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
d230: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
d240: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
d250: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
d260: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
d270: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
d280: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
d290: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
d2a0: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
d2b0: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
d2c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d2d0: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
d2e0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
d2f0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
d300: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
d310: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
d320: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d330: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
d340: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
d350: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d360: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
d370: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d380: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3a0: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d3b0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d3c0: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3e0: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d3f0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d400: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d410: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d430: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d440: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d450: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d470: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d480: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d490: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d4a0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d4b0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d4c0: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d4d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d4e0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d4f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d500: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
d510: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
d520: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
d530: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
d540: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
d550: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
d560: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
d570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
d580: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d590: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
d5a0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
d5b0: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
d5c0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d5d0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d5e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d5f0: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d600: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d610: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
d620: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72  is routine deter
d630: 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63 61  mines if pIdx ca
d640: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73 73  n be used to ass
d650: 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  ist in processin
d660: 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20  g a.** DISTINCT 
d670: 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74  qualifier. In ot
d680: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65  her words, it te
d690: 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  sts whether or n
d6a0: 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a  ot using this.**
d6b0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f   index for the o
d6c0: 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e  uter loop guaran
d6d0: 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20 77  tees that rows w
d6e0: 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73  ith equal values
d6f0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72   for.** all expr
d700: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70  essions in the p
d710: 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72  Distinct list ar
d720: 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75  e delivered grou
d730: 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  ped together..**
d740: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
d750: 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a   the query .**.*
d760: 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  *   SELECT DISTI
d770: 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  NCT a, b, c FROM
d780: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f   tbl WHERE a = ?
d790: 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66  .**.** can benef
d7a0: 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65  it from any inde
d7b0: 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22  x on columns "b"
d7c0: 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61   and "c"..*/.sta
d7d0: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
d7e0: 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ctIndex(.  Parse
d7f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d810: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d820: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
d830: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
d840: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
d850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65  clause */.  Inde
d860: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d880: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
d890: 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69  onsidered */.  i
d8a0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8c0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
d8d0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 49  for the table pI
d8e0: 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78  dx is on */.  Ex
d8f0: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
d900: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
d910: 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   The DISTINCT ex
d920: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69  pressions */.  i
d930: 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20  nt nEqCol       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
d960: 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d  x columns with =
d970: 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  = */.){.  Bitmas
d980: 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  k mask = 0;     
d990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
d9a0: 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64  k of unaccounted
d9b0: 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65   for pDistinct e
d9c0: 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  xprs */.  int i;
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d9f0: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
da00: 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  /..  if( pIdx->z
da10: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74  Name==0 || pDist
da20: 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74  inct==0 || pDist
da30: 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  inct->nExpr>=BMS
da40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
da50: 65 73 74 63 61 73 65 28 20 70 44 69 73 74 69 6e  estcase( pDistin
da60: 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  ct->nExpr==BMS-1
da70: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
da80: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65  hrough all the e
da90: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
daa0: 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e  e distinct list.
dab0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a   If any of them.
dac0: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d    ** are not sim
dad0: 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  ple column refer
dae0: 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61  ences, return ea
daf0: 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rly. Otherwise, 
db00: 74 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  test if the.  **
db10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
db20: 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22  ntains a "col=X"
db30: 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64   clause. If it d
db40: 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73  oes, the express
db50: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ion.  ** can be 
db60: 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64  ignored. If it d
db70: 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65  oes not, and the
db80: 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74   column does not
db90: 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20   belong to the. 
dba0: 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61   ** same table a
dbb0: 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65  s index pIdx, re
dbc0: 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61  turn early. Fina
dbd0: 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73  lly, if there is
dbe0: 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e   no.  ** matchin
dbf0: 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73  g "col=X" expres
dc00: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c  sion and the col
dc10: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61  umn is on the sa
dc20: 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78  me table as pIdx
dc30: 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63  ,.  ** set the c
dc40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
dc50: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73   in variable mas
dc60: 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  k..  */.  for(i=
dc70: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
dc80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
dc90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dca0: 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  m;.    Expr *p =
dcb0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
dcc0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
dcd0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
dce0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
dcf0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
dd00: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
dd10: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
dd20: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
dd30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
dd40: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
dd50: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
dd60: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
dd70: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
dd80: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
dd90: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
dda0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
ddb0: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
ddc0: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
ddd0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
dde0: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
ddf0: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
de00: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
de10: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
de20: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
de30: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
de40: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
de50: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
de60: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
de70: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
de80: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
de90: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
dea0: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
deb0: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
dec0: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
ded0: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
dee0: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
def0: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
df00: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
df10: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
df20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
df30: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
df40: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
df50: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
df60: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
df70: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
df80: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
df90: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
dfa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
dfb0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
dfc0: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
dfd0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
dfe0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
dff0: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
e000: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
e010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e020: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
e030: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
e040: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
e050: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
e060: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
e070: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
e080: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
e090: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
e0a0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
e0d0: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
e0e0: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
e0f0: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
e100: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
e110: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
e120: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
e130: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
e140: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
e150: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
e160: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
e170: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
e180: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
e190: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
e1a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
e1b0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
e1c0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
e1d0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
e1e0: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
e1f0: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
e200: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
e210: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
e220: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
e230: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
e240: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
e250: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
e260: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
e270: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
e280: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
e290: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
e2a0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
e2b0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
e2c0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
e2d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e2e0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69     Expr *p = pDi
e2f0: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
e300: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
e310: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
e320: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
e330: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
e340: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
e350: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
e360: 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
e370: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
e380: 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
e390: 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
e3a0: 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
e3b0: 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
e3c0: 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
e3d0: 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
e3e0: 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
e3f0: 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
e400: 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
e410: 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
e420: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
e430: 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
e440: 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
e450: 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
e460: 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
e470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
e480: 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
e490: 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
e4a0: 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
e4b0: 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
e4c0: 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
e4d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e4e0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
e4f0: 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
e500: 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
e510: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
e520: 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
e530: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
e540: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e550: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e560: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e570: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
e580: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
e590: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
e5a0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
e5b0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
e5c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e5d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
e5e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
e5f0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
e600: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
e610: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
e620: 64 78 29 20 0a 20 20 20 20 20 20 20 26 26 20 30  dx) .       && 0
e630: 3e 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50  >findIndexCol(pP
e640: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
e650: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
e660: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
e670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e680: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e690: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
e6a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e6b0: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
e6c0: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
e6d0: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
e6e0: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
e6f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e700: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
e710: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
e720: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
e730: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
e740: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
e750: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
e760: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
e770: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
e780: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
e790: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
e7a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e7b0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
e7c0: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
e7d0: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
e7e0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
e7f0: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
e800: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
e810: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e820: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
e830: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
e840: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
e850: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
e860: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
e870: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
e880: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
e890: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
e8a0: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
e8b0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e8c0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
e8d0: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
e8e0: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
e8f0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
e900: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
e910: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
e920: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
e930: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
e940: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
e950: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
e960: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
e970: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
e980: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
e990: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
e9a0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
e9b0: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
e9c0: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
e9d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
e9e0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
e9f0: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
ea00: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
ea10: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
ea20: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
ea30: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
ea40: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
ea50: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ea60: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
ea70: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
ea80: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
ea90: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
eaa0: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
eab0: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
eac0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
ead0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
eae0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
eaf0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
eb00: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
eb10: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
eb20: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
eb30: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
eb40: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
eb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
eb60: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
eb70: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
eb80: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
eb90: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
eba0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
ebb0: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
ebc0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ebd0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
ebe0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
ebf0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
ec00: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
ec10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
ec20: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
ec30: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
ec40: 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73  */.  int wsFlags
ec50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ec60: 49 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61  Index usages fla
ec70: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  gs */.  int *pbR
ec80: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
ec90: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
eca0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
ecb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
ecc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ece0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
ecf0: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed10: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
ed20: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
ed30: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
ed40: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
ed70: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
ed80: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ed90: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
eda0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
edb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
edc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
edd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ede0: 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79  .  if( !pOrderBy
edf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ee00: 66 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  f( wsFlags & WHE
ee10: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72  RE_COLUMN_IN ) r
ee20: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
ee30: 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  Idx->bUnordered 
ee40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
ee50: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
ee60: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
ee70: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
ee80: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  /* Argument pIdx
ee90: 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
eea0: 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e  nt to a 'real' n
eeb0: 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63  amed index struc
eec0: 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61  ture, .  ** or a
eed0: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
eee0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  e allocated on t
eef0: 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74  he stack by best
ef00: 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a  BtreeIndex() to.
ef10: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74    ** represent t
ef20: 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74  he rowid index t
ef30: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65  hat is part of e
ef40: 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  very table.  */.
ef50: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
ef60: 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e  zName || (pIdx->
ef70: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
ef80: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
ef90: 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =-1) );..  /* Ma
efa0: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
efb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
efc0: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
efd0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
efe0: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
eff0: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
f000: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
f010: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
f020: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
f030: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
f040: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
f050: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
f060: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
f070: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
f080: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
f090: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
f0a0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
f0b0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
f0c0: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
f0d0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
f0e0: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
f0f0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
f100: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
f110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
f120: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
f130: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
f140: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
f150: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
f160: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f170: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
f180: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
f190: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
f1a0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
f1b0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
f1c0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
f1d0: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
f1e0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
f1f0: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
f200: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
f210: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
f220: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
f230: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
f240: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
f250: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
f260: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
f270: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f280: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
f290: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
f2a0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
f2b0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
f2c0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
f2d0: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
f2e0: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
f2f0: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
f300: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
f310: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
f320: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
f330: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
f340: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
f350: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f360: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
f370: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
f380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f390: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
f3a0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
f3b0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
f3c0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
f3d0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
f3e0: 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26  f( pIdx->zName &
f3f0: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
f400: 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
f410: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
f420: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
f430: 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
f440: 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
f450: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
f460: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
f470: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
f480: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
f490: 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
f4a0: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
f4b0: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
f4c0: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
f4d0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
f4e0: 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
f4f0: 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
f500: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
f510: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
f520: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
f530: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f540: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
f550: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
f560: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
f570: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
f580: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
f590: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
f5a0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
f5b0: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
f5c0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
f5d0: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
f5e0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
f5f0: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
f600: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
f610: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
f620: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
f630: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
f640: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
f650: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
f660: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
f670: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f680: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
f690: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
f6a0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
f6b0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
f6c0: 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
f6d0: 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
f6e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
f6f0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
f700: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
f710: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
f720: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
f730: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
f740: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
f750: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
f760: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
f770: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
f780: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f790: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f7a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f7b0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
f7c0: 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f  tOrder!=0 || iCo
f7d0: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  lumn==-1 );.    
f7e0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73  assert( pTerm->s
f7f0: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
f800: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
f810: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
f820: 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( iSortOrder==0 
f830: 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31  || iSortOrder==1
f840: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
f850: 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64  Order = iSortOrd
f860: 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  er ^ pTerm->sort
f870: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
f880: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
f890: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
f8a0: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
f8b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
f8c0: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
f8d0: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
f8e0: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
f8f0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
f900: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f910: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
f920: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
f930: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f940: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
f950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
f960: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
f970: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
f980: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
f990: 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  m++;.    if( iCo
f9a0: 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72  lumn<0 && !refer
f9b0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
f9c0: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
f9d0: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
f9e0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
f9f0: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
fa00: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
fa10: 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e  ey and everythin
fa20: 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20  g matches.      
fa30: 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f  ** so far and no
fa40: 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
fa50: 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  BY terms to the 
fa60: 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20  right reference 
fa70: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  other.      ** t
fa80: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
fa90: 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  n, then we are a
faa0: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
fab0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
fac0: 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73  d .      ** to s
fad0: 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ort because the 
fae0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
faf0: 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e  nique and so non
fb00: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20  e of the other. 
fb10: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
fb20: 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69  will make any di
fb30: 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  fference.      *
fb40: 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72  /.      j = nTer
fb50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
fb60: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
fb70: 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d  er!=0;.  if( j>=
fb80: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  nTerm ){.    /* 
fb90: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
fba0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fbb0: 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
fbc0: 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20  this index so.  
fbd0: 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20    ** this index 
fbe0: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
fbf0: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  sorting. */.    
fc00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
fc10: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
fc20: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d  r!=OE_None && i=
fc30: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  =pIdx->nColumn. 
fc40: 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
fc50: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
fc60: 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26  NULL)==0.      &
fc70: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
fc80: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
fc90: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
fca0: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  base) ){.    /* 
fcb0: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69  All terms of thi
fcc0: 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f  s index match so
fcd0: 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  me prefix of the
fce0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fcf0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
fd00: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20  index is UNIQUE 
fd10: 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20  and no terms on 
fd20: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
fd30: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
fd40: 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65  clause reference
fd50: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
fd60: 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69   a join.  If thi
fd70: 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68  s is all true th
fd80: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  en.    ** the or
fd90: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73  der by clause is
fda0: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e   superfluous.  N
fdb0: 6f 74 20 74 68 61 74 20 69 66 20 74 68 65 20 6d  ot that if the m
fdc0: 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63  atching.    ** c
fdd0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e  ondition is IS N
fde0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
fdf0: 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ult is not neces
fe00: 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20  sarily unique.  
fe10: 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55    ** even on a U
fe20: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20  NIQUE index, so 
fe30: 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63  disallow those c
fe40: 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ases. */.    ret
fe50: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
fe60: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fe70: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
fe80: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
fe90: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
fea0: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
feb0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
fec0: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
fed0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
fee0: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
fef0: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
ff00: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
ff10: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
ff20: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
ff30: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
ff40: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
ff50: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
ff60: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
ff70: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
ff80: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
ff90: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
ffa0: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
ffb0: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
ffc0: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
ffd0: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
ffe0: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
fff0: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
10000 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
10010 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
10020 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
10030 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
10040 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
10050 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10060 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
10070 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
10080 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
10090 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
100a0 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
100b0 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
100c0 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
100d0 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
100e0 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
100f0 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
10100 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
10110 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
10120 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
10130 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
10140 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
10150 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
10160 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
10170 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10180 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
10190 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
101a0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
101b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
101c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
101d0 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
101e0 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
101f0 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
10200 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
10210 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10220 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
10230 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
10240 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
10250 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
10260 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
10270 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
10280 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
10290 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
102a0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
102b0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
102c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
102d0 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
102e0 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
102f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
10300 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
10310 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
10320 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
10330 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
10340 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
10350 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
10360 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
10370 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
10380 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10390 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
103a0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
103b0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
103c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
103d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
103e0 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
103f0 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
10400 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
10410 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
10420 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
10430 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
10440 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10450 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
10460 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
10470 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
10480 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
10490 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
104a0 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
104b0 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
104c0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
104d0 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
104e0 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
104f0 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
10500 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
10510 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
10520 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
10530 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
10540 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
10550 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
10560 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
10570 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
10580 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
10590 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64  ./* .** Required
105a0 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64   because bestInd
105b0 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ex() is called b
105c0 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  y bestOrClauseIn
105d0 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63  dex() .*/.static
105e0 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
105f0 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65  .    Parse*, Whe
10600 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63  reClause*, struc
10610 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
10620 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69  .    Bitmask, Bi
10630 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a  tmask, ExprList*
10640 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a  , WhereCost*);..
10650 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10660 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
10670 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20  ind an scanning 
10680 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61  strategy that ca
10690 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  n be used .** to
106a0 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52   optimize an 'OR
106b0 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ' expression tha
106c0 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57  t is part of a W
106d0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a  HERE clause. .**
106e0 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73  .** The table as
106f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52  sociated with FR
10700 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
10710 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65  Src may be eithe
10720 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42  r a.** regular B
10730 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61  -Tree table or a
10740 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
10750 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
10760 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
10770 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10780 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10790 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
107a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
107b0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
107c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
107d0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
107e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
107f0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10800 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10810 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
10820 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
10830 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
10840 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
10850 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
10860 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
10870 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
10880 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
10890 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
108a0 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
108b0 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
108c0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
108d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
108e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
108f0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
10900 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
10910 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
10920 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
10930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10940 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
10950 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74  TION.  const int
10960 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
10970 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
10980 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
10990 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
109a0 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  ed */.  const Bi
109b0 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
109c0 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
109d0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
109e0 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
109f0 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10a00 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10a10 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10a20 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
10a30 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10a40 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
10a50 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
10a60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
10a70 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
10a80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10a90 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c  ..  /* The OR-cl
10aa0 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ause optimizatio
10ab0 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  n is disallowed 
10ac0 69 66 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  if the INDEXED B
10ad0 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20 49 4e  Y or.  ** NOT IN
10ae0 44 45 58 45 44 20 63 6c 61 75 73 65 73 20 61 72  DEXED clauses ar
10af0 65 20 75 73 65 64 20 6f 72 20 69 66 20 74 68 65  e used or if the
10b00 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
10b10 62 69 74 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  bit is set. */. 
10b20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
10b30 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70  dexed || pSrc->p
10b40 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20  Index!=0 ){.    
10b50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
10b60 28 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c 61 67  ( pWC->wctrlFlag
10b70 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  s & WHERE_AND_ON
10b80 4c 59 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LY ){.    return
10b90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72  ;.  }..  /* Sear
10ba0 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
10bb0 75 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20  use terms for a 
10bc0 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72  usable WO_OR ter
10bd0 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  m. */.  for(pTer
10be0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
10bf0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
10c00 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
10c10 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
10c20 52 20 0a 20 20 20 20 20 26 26 20 28 28 70 54 65  R .     && ((pTe
10c30 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
10c40 7e 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f 74 52  ~maskSrc) & notR
10c50 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26  eady)==0.     &&
10c60 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   (pTerm->u.pOrIn
10c70 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20  fo->indexable & 
10c80 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20  maskSrc)!=0 .   
10c90 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
10ca0 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
10cb0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
10cc0 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
10cd0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
10ce0 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
10cf0 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
10d00 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
10d10 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
10d20 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  m;.      int fla
10d30 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs = WHERE_MULTI
10d40 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  _OR;.      doubl
10d50 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  e rTotal = 0;.  
10d60 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20      double nRow 
10d70 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  = 0;.      Bitma
10d80 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  sk used = 0;..  
10d90 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d      for(pOrTerm=
10da0 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72  pOrWC->a; pOrTer
10db0 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54  m<pOrWCEnd; pOrT
10dc0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
10dd0 57 68 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43  WhereCost sTermC
10de0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45  ost;.        WHE
10df0 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75  RETRACE(("... Mu
10e00 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73  lti-index OR tes
10e10 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64  ting for term %d
10e20 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a   of %d....\n", .
10e30 20 20 20 20 20 20 20 20 20 20 28 70 4f 72 54 65            (pOrTe
10e40 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20  rm - pOrWC->a), 
10e50 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29  (pTerm - pWC->a)
10e60 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20  .        ));.   
10e70 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
10e80 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
10e90 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AND ){.         
10ea0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
10eb0 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  ndWC = &pOrTerm-
10ec0 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
10ed0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
10ee0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e  ndex(pParse, pAn
10ef0 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  dWC, pSrc, notRe
10f00 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30  ady, notValid, 0
10f10 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
10f20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10f30 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
10f40 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
10f50 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
10f60 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20  use tempWC;.    
10f70 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61        tempWC.pPa
10f80 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
10f90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  e;.          tem
10fa0 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70  pWC.pMaskSet = p
10fb0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
10fc0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10fd0 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
10fe0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
10ff0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
11000 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
11010 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
11020 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72 6c 46     tempWC.wctrlF
11030 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
11040 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
11050 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
11060 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
11070 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c  , &tempWC, pSrc,
11080 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
11090 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f  lid, 0, &sTermCo
110a0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  st);.        }el
110b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
110c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
110d0 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c  }.        rTotal
110e0 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72 43   += sTermCost.rC
110f0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  ost;.        nRo
11100 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 70  w += sTermCost.p
11110 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  lan.nRow;.      
11120 20 20 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43    used |= sTermC
11130 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20  ost.used;.      
11140 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43    if( rTotal>=pC
11150 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65  ost->rCost ) bre
11160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
11170 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
11180 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
11190 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74  ause, increase t
111a0 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20  he scan cost to 
111b0 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a  account .      *
111c0 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  * for the cost o
111d0 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20  f the sort. */. 
111e0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
111f0 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y!=0 ){.        
11200 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11210 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
11220 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20  es OR cost %.9g 
11230 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20  to %.9g\n",.    
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e  rTotal, rTotal+n
11260 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29  Row*estLog(nRow)
11270 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74  ));.        rTot
11280 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  al += nRow*estLo
11290 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  g(nRow);.      }
112a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
112b0 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69  e cost of scanni
112c0 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52  ng using this OR
112d0 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69   term for optimi
112e0 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  zation is.      
112f0 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
11300 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74   current cost st
11310 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72  ored in pCost, r
11320 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
11330 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  nts.      ** of 
11340 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  pCost. */.      
11350 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
11360 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20   multi-index OR 
11370 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25  cost=%.9g nrow=%
11380 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20  .9g\n", rTotal, 
11390 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66  nRow));.      if
113a0 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e  ( rTotal<pCost->
113b0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
113c0 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
113d0 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
113e0 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73  pCost->used = us
113f0 65 64 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ed;.        pCos
11400 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  t->plan.nRow = n
11410 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Row;.        pCo
11420 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
11430 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   = flags;.      
11440 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
11450 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20  pTerm = pTerm;. 
11460 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11470 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11480 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
11490 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66  ZATION */.}..#if
114a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
114b0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
114c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
114d0 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20  UE if the WHERE 
114e0 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72  clause term pTer
114f0 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77  m is of a form w
11500 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64  here it.** could
11510 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
11520 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73   index to access
11530 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20   pSrc, assuming 
11540 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  an appropriate.*
11550 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e  * index existed.
11560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
11570 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
11580 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  (.  WhereTerm *p
11590 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
115a0 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
115b0 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b  se term to check
115c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
115d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
115e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65       /* Table we
115f0 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61   are trying to a
11600 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61  ccess */.  Bitma
11610 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11630 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  les in outer loo
11640 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ps of the join *
11650 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  /.){.  char aff;
11660 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65  .  if( pTerm->le
11670 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e  ftCursor!=pSrc->
11680 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
11690 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
116a0 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45  >eOperator!=WO_E
116b0 51 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  Q ) return 0;.  
116c0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
116d0 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
116e0 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
116f0 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
11700 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
11710 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
11720 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
11730 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
11740 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
11750 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
11760 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
11770 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   1;.}.#endif..#i
11780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11790 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
117a0 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  X./*.** If the q
117b0 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53  uery plan for pS
117c0 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rc specified in 
117d0 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20  pCost is a full 
117e0 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e  table scan.** an
117f0 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  d indexing is al
11800 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
11810 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
11820 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
11830 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
11840 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
11850 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
11860 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
11870 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
11880 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
11890 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
118a0 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
118b0 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
118c0 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
118d0 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
118e0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
118f0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
11900 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
11920 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
11930 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11940 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11950 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
11960 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
11970 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
11980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
11990 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
119a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
119b0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
119c0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
119d0 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
119e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
119f0 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
11a00 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
11a10 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
11a20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
11a30 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
11a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11a50 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
11a60 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75  plan */.){.  dou
11a70 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20  ble nTableRow;  
11a80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
11a90 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
11aa0 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
11ab0 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
11ac0 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62       /* log(nTab
11ad0 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62  leRow) */.  doub
11ae0 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20  le costTempIdx; 
11af0 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71          /* per-q
11b00 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65  uery cost of the
11b10 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
11b20 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11b30 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
11b40 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
11b50 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
11b60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
11b70 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
11b80 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
11b90 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
11ba0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11bc0 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62  able tht might b
11bd0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  e indexed */..  
11be0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  if( pParse->nQue
11bf0 72 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29  ryLoop<=(double)
11c00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  1 ){.    /* Ther
11c10 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
11c20 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74   building an aut
11c30 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72  omatic index for
11c40 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a   a single scan *
11c50 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11c60 7d 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  }.  if( (pParse-
11c70 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
11c80 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d  ITE_AutoIndex)==
11c90 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f  0 ){.    /* Auto
11ca0 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72  matic indices ar
11cb0 65 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75  e disabled at ru
11cc0 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65  n-time */.    re
11cd0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
11ce0 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46  (pCost->plan.wsF
11cf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
11d00 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29 7b  _FULLSCAN)!=0 ){
11d10 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61  .    /* We alrea
11d20 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e  dy have some kin
11d30 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73  d of index in us
11d40 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  e for this query
11d50 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11d60 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11d70 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20  >notIndexed ){. 
11d80 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e     /* The NOT IN
11d90 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70  DEXED clause app
11da0 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e  ears in the SQL.
11db0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11dc0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
11dd0 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a  isCorrelated ){.
11de0 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
11df0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
11e00 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20  d sub-query. No 
11e10 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e  point in indexin
11e20 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74  g it. */.    ret
11e30 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  urn;.  }..  asse
11e40 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  rt( pParse->nQue
11e50 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c  ryLoop >= (doubl
11e60 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20  e)1 );.  pTable 
11e70 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
11e80 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62  nTableRow = pTab
11e90 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c  le->nRowEst;.  l
11ea0 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61  ogN = estLog(nTa
11eb0 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54  bleRow);.  costT
11ec0 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a  empIdx = 2*logN*
11ed0 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73  (nTableRow/pPars
11ee0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20  e->nQueryLoop + 
11ef0 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65  1);.  if( costTe
11f00 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43  mpIdx>=pCost->rC
11f10 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ost ){.    /* Th
11f20 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69  e cost of creati
11f30 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
11f40 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20   table would be 
11f50 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
11f60 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75   ** doing the fu
11f70 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
11f80 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11f90 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
11fa0 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63  r any equality c
11fb0 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a  omparison term *
11fc0 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  /.  pWCEnd = &pW
11fd0 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
11fe0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
11ff0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12000 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12010 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12020 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12030 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12040 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
12050 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20  CE(("auto-index 
12060 72 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f  reduces cost fro
12070 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e  m %.1f to %.1f\n
12080 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12090 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43         pCost->rC
120a0 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78  ost, costTempIdx
120b0 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  ));.      pCost-
120c0 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d  >rCost = costTem
120d0 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73  pIdx;.      pCos
120e0 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c  t->plan.nRow = l
120f0 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  ogN + 1;.      p
12100 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
12110 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs = WHERE_TEMP_
12120 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f  INDEX;.      pCo
12130 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d  st->used = pTerm
12140 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
12150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12160 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
12170 64 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d  define bestAutom
12180 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c  aticIndex(A,B,C,
12190 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D,E)  /* no-op *
121a0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
121b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
121c0 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66  C_INDEX */...#if
121d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
121e0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
121f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12200 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63  code to construc
12210 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  t the Index obje
12220 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61  ct for an automa
12230 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  tic index.** and
12240 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57   to set up the W
12250 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74  hereLevel object
12260 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20   pLevel so that 
12270 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
12280 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20  or.** makes use 
12290 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  of the automatic
122a0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
122b0 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74  c void construct
122c0 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a  AutomaticIndex(.
122d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
122f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
12300 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
12310 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
12320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
12330 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
12340 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12350 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
12360 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
12370 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65  rm to get the ne
12380 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69  xt index */.  Bi
12390 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
123a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
123b0 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
123c0 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
123d0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ble */.  WhereLe
123e0 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20  vel *pLevel     
123f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
12400 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a  w index here */.
12410 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  ){.  int nColumn
12420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12430 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
12440 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e  lumns in the con
12450 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a  structed index *
12460 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
12470 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
12480 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
12490 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
124a0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
124b0 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20  erm *pWCEnd;    
124c0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
124d0 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  pWC->a[] */.  in
124e0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
12500 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64  e of memory need
12510 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  ed for pIdx */. 
12520 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12540 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  Object describin
12550 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
12560 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
12570 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12580 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
12590 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
125a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
125b0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69  */.  int addrIni
125c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
125d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
125e0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
125f0 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f  n bypass jump */
12600 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
12610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12620 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
12630 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b  g indexed */.  K
12640 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f  eyInfo *pKeyinfo
12650 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65  ;          /* Ke
12660 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
12670 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20  r the index */  
12680 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b   .  int addrTop;
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
126b0 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
126c0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
126d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
126e0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
126f0 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
12700 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
12730 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
12740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12750 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
12760 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
12770 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
12780 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
12790 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
127a0 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
127b0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
127c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
127d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
127e0 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
127f0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
12800 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
12810 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
12820 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
12830 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
12840 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
12850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
12860 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
12870 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  l columns */..  
12880 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12890 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68   to skip over th
128a0 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69  e creation and i
128b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
128c0 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69   the.  ** transi
128d0 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64  ent index on 2nd
128e0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
128f0 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  iterations of th
12900 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d  e loop. */.  v =
12910 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
12920 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
12930 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
12940 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
12950 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 43 6f  Parse);..  /* Co
12960 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
12970 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
12980 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
12990 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
129a0 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
129b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
129c0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
129d0 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54  Column = 0;.  pT
129e0 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
129f0 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
12a00 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
12a10 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  ];.  idxCols = 0
12a20 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
12a30 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12a40 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12a50 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12a60 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12a70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12a80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12a90 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12aa0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
12ab0 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
12ac0 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
12ad0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
12ae0 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
12af0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  iCol;.      test
12b00 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
12b10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12b20 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
12b30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
12b40 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
12b50 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   ){.        nCol
12b60 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  umn++;.        i
12b70 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
12b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12b90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
12ba0 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76  lumn>0 );.  pLev
12bb0 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  el->plan.nEq = n
12bc0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f  Column;..  /* Co
12bd0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
12be0 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
12bf0 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
12c00 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
12c10 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
12c20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
12c30 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
12c40 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
12c50 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
12c60 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
12c70 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
12c80 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
12c90 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
12ca0 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
12cb0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
12cc0 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
12cd0 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
12ce0 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
12cf0 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
12d00 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
12d10 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
12d20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
12d30 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
12d40 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
12d50 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
12d60 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
12d70 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
12d80 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
12d90 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
12da0 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
12db0 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61  xCols | (((Bitma
12dc0 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29  sk)1)<<(BMS-1)))
12dd0 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
12de0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
12df0 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
12e00 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
12e10 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
12e20 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
12e30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
12e40 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
12e50 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
12e60 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
12e70 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
12e80 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
12e90 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d  )1)<<i) ) nColum
12ea0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n++;.  }.  if( p
12eb0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
12ec0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
12ed0 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43  MS-1)) ){.    nC
12ee0 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
12ef0 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
12f00 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  .  }.  pLevel->p
12f10 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
12f20 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
12f30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
12f40 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43  | WO_EQ;..  /* C
12f50 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
12f60 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
12f70 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
12f80 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   */.  nByte = si
12f90 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e  zeof(Index);.  n
12fa0 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
12fb0 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20  sizeof(int);    
12fc0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
12fd0 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d  mn */.  nByte +=
12fe0 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28   nColumn*sizeof(
12ff0 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64  char*);   /* Ind
13000 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e  ex.azColl */.  n
13010 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b  Byte += nColumn;
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
13040 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d  rder */.  pIdx =
13050 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13060 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
13070 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70   nByte);.  if( p
13080 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
13090 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  .  pLevel->plan.
130a0 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
130b0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
130c0 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d  (char**)&pIdx[1]
130d0 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
130e0 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78  mn = (int*)&pIdx
130f0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e  ->azColl[nColumn
13100 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  ];.  pIdx->aSort
13110 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
13120 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  dx->aiColumn[nCo
13130 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a  lumn];.  pIdx->z
13140 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
13150 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  ex";.  pIdx->nCo
13160 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  lumn = nColumn;.
13170 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
13180 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
13190 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
131a0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
131b0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
131c0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
131d0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
131e0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
131f0 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
13200 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
13210 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
13220 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
13230 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
13240 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
13250 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
13260 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
13270 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Col;.      if( (
13280 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
13290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
132a0 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
132b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
132c0 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
132d0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
132e0 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
132f0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
13300 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
13310 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
13320 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
13330 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
13340 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
13350 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
13360 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28  oll[n] = ALWAYS(
13370 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e  pColl) ? pColl->
13380 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22  zName : "BINARY"
13390 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
133a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
133b0 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
133c0 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  n==pLevel->plan.
133d0 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
133e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
133f0 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
13400 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
13410 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
13420 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
13430 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
13440 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
13450 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
13460 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
13470 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20  )1)<<i) ){.     
13480 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
13490 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
134a0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
134b0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
134c0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
134d0 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
134e0 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
134f0 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
13500 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
13510 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
13520 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
13530 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13540 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
13550 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
13560 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
13570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
13580 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( n==nColumn 
13590 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
135a0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
135b0 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66  dex */.  pKeyinf
135c0 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
135d0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
135e0 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28  pIdx);.  assert(
135f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13600 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=0 );.  sqlite3
13610 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13620 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
13630 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
13640 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20   nColumn+1, 0,. 
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e     (char*)pKeyin
13670 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
13680 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43  ANDOFF);.  VdbeC
13690 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
136a0 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
136b0 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
136c0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
136d0 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
136e0 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
136f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13700 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
13710 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
13720 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
13730 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13740 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
13750 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
13760 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
13770 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
13780 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
13790 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
137a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
137b0 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
137c0 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
137d0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
137e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
137f0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
13800 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ULT);.  sqlite3V
13810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13820 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
13830 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
13840 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13850 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
13860 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
13870 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
13880 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13890 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
138a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
138b0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
138c0 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
138d0 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
138e0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
138f0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
13900 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13910 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
13920 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
13930 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
13940 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
13950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13960 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13970 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
13980 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
13990 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
139a0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
139b0 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
139c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
139d0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
139e0 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
139f0 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
13a00 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
13a10 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
13a20 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
13a30 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
13a40 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
13a50 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13a60 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
13a70 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
13a80 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61  rse, .  WhereCla
13a90 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
13aa0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13ab0 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
13ac0 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
13ad0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
13ae0 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
13af0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13b00 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
13b10 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
13b20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13b30 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
13b40 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13b50 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13b60 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
13b70 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
13b80 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
13b90 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
13ba0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
13bb0 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54  xInfo;..  WHERET
13bc0 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
13bd0 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
13be0 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63  r %s...\n", pSrc
13bf0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
13c00 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
13c10 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
13c20 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
13c30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
13c40 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
13c50 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
13c60 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
13c70 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
13c80 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
13c90 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
13ca0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13cb0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
13cc0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
13cd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
13ce0 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
13cf0 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
13d00 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
13d10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
13d20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13d30 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
13d40 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
13d50 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
13d60 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
13d70 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13d80 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
13d90 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
13da0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
13db0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
13dc0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
13dd0 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
13de0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
13df0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
13e00 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
13e10 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
13e20 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
13e30 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
13e40 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
13e50 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
13e60 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
13e70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13e80 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
13e90 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
13ea0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
13eb0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
13ec0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
13ed0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
13ee0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
13ef0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
13f00 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
13f10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
13f20 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
13f30 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
13f40 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
13f50 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64  .    if( i==pOrd
13f60 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
13f70 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
13f80 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13fa0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
13fb0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13fc0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
13fd0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
13fe0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
13ff0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
14000 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
14030 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
14040 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
14050 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
14080 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
14090 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
140a0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
140b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
140c0 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
140d0 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
140e0 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
140f0 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
14100 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
14110 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
14120 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
14130 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
14140 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
14150 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14160 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
14170 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
14180 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
14190 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
141a0 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
141b0 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
141c0 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
141d0 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
141e0 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
141f0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
14200 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
14210 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
14220 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
14230 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14240 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
14250 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
14260 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
14270 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
14280 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
14290 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
142a0 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
142b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
142c0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
142d0 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
142e0 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
142f0 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
14300 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
14310 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
14320 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
14330 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
14340 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14350 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
14360 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
14370 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
14380 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
14390 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
143a0 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
143b0 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
143c0 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
143d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
143e0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
143f0 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
14400 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
14410 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
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 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
14460 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
14470 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
14480 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
14490 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
144a0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
144b0 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
144c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
144d0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
144e0 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
144f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
14500 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
14510 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
14520 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
14530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
14540 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
14550 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
14560 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
14570 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
14580 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
14590 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
145a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
145b0 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74  ERM_VNULL ) cont
145c0 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f  inue;.    pIdxCo
145d0 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
145e0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
145f0 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
14600 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
14610 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f   = i;.    pIdxCo
14620 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70  ns[j].op = (u8)p
14630 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
14640 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
14650 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
14660 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
14670 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
14680 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
14690 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
146a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
146b0 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
146c0 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
146d0 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
146e0 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
146f0 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
14700 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
14710 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
14720 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
14730 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14740 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
14750 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
14760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14770 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
14780 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
14790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
147a0 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
147b0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
147c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
147d0 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
147e0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
147f0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
14800 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
14810 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14820 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
14830 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
14840 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
14850 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
14860 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
14870 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
14880 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
14890 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
148a0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
148b0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
148c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
148d0 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
148e0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
148f0 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
14900 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
14910 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
14920 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
14930 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
14950 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
14960 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
14970 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14980 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
14990 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
149a0 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
149b0 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
149c0 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
149d0 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
149e0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
149f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
14a00 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
14a10 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65  ndex_info pointe
14a20 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
14a30 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  he argument..**.
14a40 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
14a50 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
14a60 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
14a70 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
14a80 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
14a90 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
14aa0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
14ab0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
14ac0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
14ad0 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
14ae0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14af0 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
14b00 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
14b10 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
14b20 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
14b30 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
14b40 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
14b50 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
14b60 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14b70 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
14b80 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
14b90 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
14ba0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
14bb0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
14bc0 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
14bd0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
14be0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
14bf0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
14c00 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
14c10 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
14c20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
14c30 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
14c40 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
14c50 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
14c60 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
14c70 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
14c80 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
14c90 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
14ca0 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
14cb0 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
14cc0 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
14cd0 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
14ce0 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
14cf0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
14d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14d10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
14d20 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
14d30 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
14d40 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
14d50 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
14d60 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
14d70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14d80 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
14d90 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
14da0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14db0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14dc0 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
14dd0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
14de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
14df0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
14e00 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
14e10 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
14e20 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
14e30 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
14e40 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
14e50 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
14e60 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
14e70 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
14e80 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
14e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14ea0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14eb0 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
14ec0 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
14ed0 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
14ee0 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
14ef0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
14f00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
14f10 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f  rse->nErr;.}.../
14f20 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
14f30 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20   best index for 
14f40 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
14f50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20  .**.** The best 
14f60 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65  index is compute
14f70 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
14f80 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
14f90 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
14fa0 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73  le module.  This
14fb0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c   routine is real
14fc0 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65  ly just a wrappe
14fd0 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a  r that sets up.*
14fe0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
14ff0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15000 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  re that is used 
15010 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77  to communicate w
15020 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ith.** xBestInde
15030 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f  x..**.** In a jo
15040 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  in, this routine
15050 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
15060 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
15070 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  for the.** same 
15080 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
15090 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
150a0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
150b0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
150c0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  nd initialized o
150d0 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
150e0 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  cation and reuse
150f0 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75  d on all subsequ
15100 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ent.** invocatio
15110 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ns.  The sqlite3
15120 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15130 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73  cture is also us
15140 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  ed when.** code 
15150 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
15160 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75  access the virtu
15170 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77  al table.  The w
15180 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29  hereInfoDelete()
15190 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b   .** routine tak
151a0 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  es care of freei
151b0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ng the sqlite3_i
151c0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
151d0 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65  ure after.** eve
151e0 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73  rybody has finis
151f0 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a  hed with it..*/.
15200 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
15210 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20  VirtualIndex(.  
15220 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
15250 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
15260 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
15270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15280 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15290 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
152a0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
152b0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
152c0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
152d0 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
152e0 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
152f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
15300 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
15310 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
15320 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
15330 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
15340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
15350 75 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64  ursors not valid
15360 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
15370 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15380 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
15390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
153a0 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
153b0 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
153c0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
153d0 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
153e0 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20   query plan */. 
153f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15400 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
15410 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
15420 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
15430 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
15440 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
15450 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
15460 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15470 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
15480 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15490 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
154a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
154b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
154c0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
154d0 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
154e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
154f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
15500 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75   nOrderBy;.  dou
15510 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a  ble rCost;..  /*
15520 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61   Make sure wsFla
15530 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  gs is initialize
15540 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76  d to some sane v
15550 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
15560 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61   if the .  ** ma
15570 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65  lloc in allocate
15580 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c  IndexInfo() fail
15590 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
155a0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76  ion returns leav
155b0 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73  ing.  ** wsFlags
155c0 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   in an uninitial
155d0 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20  ized state, the 
155e0 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76  caller may behav
155f0 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e  e unpredictably.
15600 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  .  */.  memset(p
15610 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
15620 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73  *pCost));.  pCos
15630 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
15640 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
15650 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ABLE;..  /* If t
15660 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
15670 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
15680 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
15690 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
156a0 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
156b0 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c  alized, then all
156c0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
156d0 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  lize it now..  *
156e0 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a  /.  pIdxInfo = *
156f0 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28  ppIdxInfo;.  if(
15700 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
15710 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
15720 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
15730 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
15740 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
15750 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   pOrderBy);.  }.
15760 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
15770 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
15780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
15790 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
157a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
157b0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
157c0 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
157d0 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
157e0 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
157f0 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
15800 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
15810 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
15820 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
15830 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
15840 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
15850 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
15860 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
15870 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
15880 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
15890 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
158a0 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
158b0 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
158c0 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
158d0 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
158e0 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20  . Also, by this 
158f0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74  point there must
15900 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74  .  ** be a point
15910 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
15920 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
15930 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20   Otherwise.  ** 
15940 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15950 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c  lumnNames() woul
15960 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70  d have picked up
15970 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a   the error. .  *
15980 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
15990 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26  ->azModuleArg &&
159a0 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
159b0 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72  rg[0] );.  asser
159c0 74 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61  t( sqlite3GetVTa
159d0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
159e0 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  pTab) );..  /* S
159f0 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69  et the aConstrai
15a00 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c  nt[].usable fiel
15a10 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ds and initializ
15a20 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70  e all .  ** outp
15a30 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
15a40 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
15a50 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
15a60 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72  able is true for
15a70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65   constraints whe
15a80 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
15a90 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74  d.  ** side cont
15aa0 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65  ains only refere
15ab0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74  nces to tables t
15ac0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
15ad0 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74  e current.  ** t
15ae0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
15af0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f  words, if the co
15b00 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
15b10 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
15b20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  **           col
15b30 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a  umn = expr.  **.
15b40 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
15b50 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69  evaluating a joi
15b60 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  n, then the cons
15b70 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e  traint on column
15b80 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76   is .  ** only v
15b90 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c  alid if all tabl
15ba0 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e  es referenced in
15bb0 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74   expr occur to t
15bc0 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
15bd0 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
15be0 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a  ning column..  *
15bf0 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73  *.  ** The aCons
15c00 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20  traints[] array 
15c10 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
15c20 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
15c30 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ints.  ** on the
15c40 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
15c50 20 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c   That way we onl
15c60 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74  y have to comput
15c70 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65  e it once.  ** e
15c80 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69  ven though we mi
15c90 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20  ght try to pick 
15ca0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d  the best index m
15cb0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20  ultiple times.. 
15cc0 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74   ** For each att
15cd0 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20  empt at picking 
15ce0 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
15cf0 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
15d00 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d   the.  ** join m
15d10 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e  ight be differen
15d20 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  t so we have to 
15d30 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73  recompute the us
15d40 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65  able flag.  ** e
15d50 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ach time..  */. 
15d60 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
15d70 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
15d80 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
15d90 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
15da0 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65  traint;.  pUsage
15db0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
15dc0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
15dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
15de0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
15df0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
15e00 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64  ++){.    j = pId
15e10 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
15e20 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  et;.    pTerm = 
15e30 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
15e40 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
15e50 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
15e60 71 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29  qRight&notReady)
15e70 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20   ? 0 : 1;.  }.  
15e80 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
15e90 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
15ea0 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
15eb0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66  onstraint);.  if
15ec0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
15ed0 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
15ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15ef0 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
15f00 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e  r);.  }.  pIdxIn
15f10 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
15f20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
15f30 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
15f40 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
15f50 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
15f60 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
15f70 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20  sumed = 0;.  /* 
15f80 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63  ((double)2) In c
15f90 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
15fa0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
15fb0 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e  T... */.  pIdxIn
15fc0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
15fd0 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
15fe0 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29  BL / ((double)2)
15ff0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
16000 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
16010 79 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  y;.  if( !pOrder
16020 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  By ){.    pIdxIn
16030 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30  fo->nOrderBy = 0
16040 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61  ;.  }..  if( vta
16050 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
16060 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
16070 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
16080 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e  ;.  }..  pIdxCon
16090 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
160a0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
160b0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
160c0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
160d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
160e0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
160f0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
16100 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  ( pUsage[i].argv
16110 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
16120 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20   pCost->used |= 
16130 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b  pWC->a[pIdxCons[
16140 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e  i].iTermOffset].
16150 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
16160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16170 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
16180 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64  R BY clause, and
16190 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 76 69   the selected vi
161a0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65  rtual table inde
161b0 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  x.  ** does not 
161c0 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72  satisfy it, incr
161d0 65 61 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ease the cost of
161e0 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64   the scan accord
161f0 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a  ingly. This.  **
16200 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 72 6f   matches the pro
16210 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d  cessing for non-
16220 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69  virtual tables i
16230 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  n bestBtreeIndex
16240 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74  ()..  */.  rCost
16250 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74   = pIdxInfo->est
16260 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66  imatedCost;.  if
16270 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 49  ( pOrderBy && pI
16280 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
16290 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20  onsumed==0 ){.  
162a0 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f    rCost += estLo
162b0 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a  g(rCost)*rCost;.
162c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
162d0 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  st is not allowe
162e0 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  d to be larger t
162f0 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  han SQLITE_BIG_D
16300 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69  BL (the.  ** ini
16310 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77  tal value of low
16320 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20  estCost in this 
16330 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20  loop. If it is, 
16340 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63  then the.  ** (c
16350 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20  ost<lowestCost) 
16360 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20  test below will 
16370 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20  never be true.. 
16380 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28   ** .  ** Use "(
16390 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61  double)2" instea
163a0 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61  d of "2.0" in ca
163b0 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  se OMIT_FLOATING
163c0 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20  _POINT .  ** is 
163d0 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  defined..  */.  
163e0 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  if( (SQLITE_BIG_
163f0 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
16400 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43  <rCost ){.    pC
16410 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51  ost->rCost = (SQ
16420 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
16430 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c  ouble)2));.  }el
16440 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72  se{.    pCost->r
16450 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
16460 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  }.  pCost->plan.
16470 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64  u.pVtabIdx = pId
16480 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
16490 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
164a0 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43  nsumed ){.    pC
164b0 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
164c0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
164d0 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d  BY;.  }.  pCost-
164e0 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20  >plan.nEq = 0;. 
164f0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
16500 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
16510 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
16520 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65  d a more efficie
16530 6e 74 20 61 63 63 65 73 73 20 70 61 74 74 65 72  nt access patter
16540 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69  n by using multi
16550 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a  ple indexes.  **
16560 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20   to optimize an 
16570 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  OR expression wi
16580 74 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  thin the WHERE c
16590 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62  lause. .  */.  b
165a0 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
165b0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
165c0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
165d0 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
165e0 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64  , pCost);.}.#end
165f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16600 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
16610 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16620 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
16630 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
16640 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70   location of a p
16650 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d  articular key am
16660 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20  ong all keys in 
16670 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74  an.** index.  St
16680 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
16690 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c  in aStat as foll
166a0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53  ows:.**.**    aS
166b0 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e  tat[0]      Est.
166c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
166d0 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a  less than pVal.*
166e0 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20  *    aStat[1]   
166f0 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
16700 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20  f rows equal to 
16710 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  pVal.**.** Retur
16720 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16730 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
16740 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74  c int whereKeySt
16750 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ats(.  Parse *pP
16760 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
16770 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16780 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  onnection */.  I
16790 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
167a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
167b0 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  dex to consider 
167c0 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73  domain of */.  s
167d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
167e0 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61  al,        /* Va
167f0 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20  lue to consider 
16800 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  */.  int roundUp
16810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16820 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20   /* Round up if 
16830 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77  true.  Round dow
16840 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20  n if false */.  
16850 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20  tRowcnt *aStat  
16860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16870 55 54 3a 20 73 74 61 74 73 20 77 72 69 74 74 65  UT: stats writte
16880 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 74  n here */.){.  t
16890 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e 64 65  Rowcnt n;.  Inde
168a0 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
168b0 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79 70 65  ;.  int i, eType
168c0 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d 20 30  ;.  int isEq = 0
168d0 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64 6f 75  ;.  i64 v;.  dou
168e0 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20 61 73  ble r, rS;..  as
168f0 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30  sert( roundUp==0
16900 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29   || roundUp==1 )
16910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
16920 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
16930 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 72   if( pVal==0 ) r
16940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16950 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  OR;.  n = pIdx->
16960 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 61  aiRowEst[0];.  a
16970 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61  Sample = pIdx->a
16980 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70 65 20  Sample;.  eType 
16990 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
169a0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
169b0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
169c0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
169d0 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
169e0 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
169f0 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
16a00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
16a10 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
16a20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
16a30 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16a40 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
16a50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
16a60 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16a70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
16a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
16a90 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16aa0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
16ab0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
16ac0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
16ad0 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
16ae0 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16af0 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
16b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16b10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16b20 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16b30 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
16b40 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
16b50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16b60 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
16b70 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
16b80 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
16b90 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
16ba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16bb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16bc0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16bd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16be0 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
16bf0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
16c00 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
16c10 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
16c20 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16c30 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16c40 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
16c50 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
16c60 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
16c70 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
16c80 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
16c90 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
16ca0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16cb0 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
16cc0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
16cd0 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
16ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16cf0 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
16d00 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
16d10 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
16d20 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
16d30 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
16d40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16d50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16d60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16d70 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
16d80 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65  .    if( aSample
16d90 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [0].eType==SQLIT
16da0 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20 3d 20  E_NULL ) isEq = 
16db0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16dc0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
16dd0 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
16de0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16df0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
16e00 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
16e10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
16e20 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16e30 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
16e40 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  || aSample[i].eT
16e50 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16e60 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16e70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16e80 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
16e90 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20 20 20  >nSample ){     
16ea0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
16eb0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16ec0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
16ed0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
16ee0 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
16ef0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
16f00 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
16f10 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
16f20 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
16f30 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
16f40 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
16f50 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
16f60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
16f70 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
16f80 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
16f90 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
16fa0 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
16fb0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
16fc0 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d  _UTF8, 0, *pIdx-
16fd0 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  >azColl);.      
16fe0 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
16ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
17000 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17010 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
17020 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
17030 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
17060 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17070 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17090 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
170a0 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78  )sqlite3ValueTex
170b0 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  t(pVal, pColl->e
170c0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
170d0 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20   !z ){.         
170e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
170f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
17100 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17110 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43  z && pColl && pC
17120 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20  oll->xCmp );.   
17130 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73     }.      n = s
17140 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73  qlite3ValueBytes
17150 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
17160 63 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72  c);.  .      for
17170 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  (; i<pIdx->nSamp
17180 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
17190 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
171a0 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65   int eSampletype
171b0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54   = aSample[i].eT
171c0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
171d0 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79   eSampletype<eTy
171e0 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pe ) continue;. 
171f0 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70         if( eSamp
17200 6c 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20  letype!=eType ) 
17210 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53  break;.#ifndef S
17220 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
17230 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
17240 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f  ll->enc!=SQLITE_
17250 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20  UTF8 ){.        
17260 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20    int nSample;. 
17270 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
17280 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
17290 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20  Utf8to16(.      
172a0 20 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c          db, pCol
172b0 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b  l->enc, aSample[
172c0 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b  i].u.z, aSample[
172d0 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70  i].nByte, &nSamp
172e0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  le.          );.
172f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
17300 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
17310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
17340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17350 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
17360 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
17370 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
17380 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20  pUser, nSample, 
17390 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a  zSample, n, z);.
173a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
173b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d  3DbFree(db, zSam
173c0 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ple);.        }e
173d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
173e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63     {.          c
173f0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
17400 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61  Coll->pUser, aSa
17410 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61  mple[i].nByte, a
17420 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e  Sample[i].u.z, n
17430 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , z);.        }.
17440 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
17450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
17460 28 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20  ( c==0 ) isEq = 
17470 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
17480 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
17490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
174a0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
174b0 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
174c0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
174d0 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
174e0 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
174f0 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
17500 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
17510 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
17520 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
17530 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
17540 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
17550 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73  ]==pVal, then is
17560 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  Eq==1..  */.  if
17570 28 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73  ( isEq ){.    as
17580 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
17590 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74  ample );.    aSt
175a0 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
175b0 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61  i].nLt;.    aSta
175c0 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
175d0 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ].nEq;.  }else{.
175e0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
175f0 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70  er, iUpper, iGap
17600 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  ;.    if( i==0 )
17610 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
17620 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
17630 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c   = aSample[0].nL
17640 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
17650 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
17660 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
17670 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  n : aSample[i].n
17680 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  Lt;.      iLower
17690 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
176a0 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  nEq + aSample[i-
176b0 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20  1].nLt;.    }.  
176c0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
176d0 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66  x->avgEq;.    if
176e0 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
176f0 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17700 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17710 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
17720 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
17730 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
17740 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
17750 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
17760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17770 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
17780 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
17790 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
177a0 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
177b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
177c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
177d0 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f  ABLE_STAT3 */../
177e0 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
177f0 6f 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65  on pExpr represe
17800 6e 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61  nts a literal va
17810 6c 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  lue, set *pp to 
17820 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73  point to.** an s
17830 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
17840 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
17850 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
17860 2c 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a  , with affinity.
17870 2a 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ** aff applied t
17880 6f 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74  o it, before ret
17890 75 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68  urning. It is th
178a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
178b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   of the .** call
178c0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
178d0 20 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74   release this st
178e0 72 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69  ructure by passi
178f0 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c  ng it to .** sql
17900 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
17910 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
17920 72 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61  rrent parse is a
17930 20 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69   recompile (sqli
17940 74 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20  te3Reprepare()) 
17950 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20  and pExpr.** is 
17960 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  an SQL variable 
17970 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
17980 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  as a non-NULL va
17990 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c  lue bound to it,
179a0 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71  .** create an sq
179b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
179c0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
179d0 20 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61   this value, aga
179e0 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e  in with.** affin
179f0 69 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20  ity aff applied 
17a00 74 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a  to it, instead..
17a10 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
17a20 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70   of the above ap
17a30 70 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ply, set *pp to 
17a40 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
17a50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
17a60 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
17a70 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
17a80 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23   SQLITE_OK..*/.#
17a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17aa0 42 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63  BLE_STAT3.static
17ab0 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78   int valueFromEx
17ac0 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
17ad0 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  rse, .  Expr *pE
17ae0 78 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20  xpr, .  u8 aff, 
17af0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17b00 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70   **pp.){.  if( p
17b10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
17b20 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78  IABLE.   || (pEx
17b30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
17b40 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
17b50 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a  2==TK_VARIABLE).
17b60 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61    ){.    int iVa
17b70 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  r = pExpr->iColu
17b80 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
17b90 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
17ba0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
17bb0 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  r);.    *pp = sq
17bc0 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
17bd0 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  e(pParse->pRepre
17be0 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29  pare, iVar, aff)
17bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17c00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
17c10 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75  turn sqlite3Valu
17c20 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
17c30 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c  ->db, pExpr, SQL
17c40 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70  ITE_UTF8, aff, p
17c50 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
17c60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17c70 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
17c80 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
17c90 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
17ca0 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
17cb0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
17cc0 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
17cd0 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
17ce0 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
17cf0 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
17d00 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
17d10 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
17d20 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
17d30 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
17d40 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
17d50 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
17d60 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
17d70 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
17d80 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
17d90 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
17da0 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
17db0 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
17dc0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
17dd0 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
17de0 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
17e10 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17e30 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
17e60 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
17e70 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
17e80 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
17e90 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
17ea0 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
17eb0 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
17ec0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
17ed0 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
17ee0 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61  .** The nEq para
17ef0 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
17f00 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
17f10 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75   index column su
17f20 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20  bject to the.** 
17f30 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
17f40 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
17f50 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
17f60 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
17f70 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69  raints.** optimi
17f80 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
17f90 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
17fa0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
17fb0 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
17fc0 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c  .** on t1(a, b),
17fd0 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
17fe0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
17ff0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
18000 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
18010 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
18020 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
18030 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
18040 68 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74  he value 1 (as t
18050 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
18060 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62  ted column,.** b
18070 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
18080 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
18090 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
180a0 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
180b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
180c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
180d0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
180e0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
180f0 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
18100 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ed 0..**.** The 
18110 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
18120 73 20 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76  s an integer div
18130 69 73 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74  isor to reduce t
18140 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20  he estimated.** 
18150 73 65 61 72 63 68 20 73 70 61 63 65 2e 20 20 41  search space.  A
18160 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
18170 20 31 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61   1 means that ra
18180 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
18190 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61  are.** no help a
181a0 74 20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e  t all.  A return
181b0 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e   value of 2 mean
181c0 73 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  s range constrai
181d0 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63  nts are.** expec
181e0 74 65 64 20 74 6f 20 72 65 64 75 63 65 20 74 68  ted to reduce th
181f0 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
18200 79 20 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20  y half.  And so 
18210 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49  forth....**.** I
18220 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
18230 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
18240 41 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68  ALYZE data, each
18250 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
18260 79 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  y.** reduces the
18270 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79   search space by
18280 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20   a factor of 4. 
18290 20 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20   Hence a single 
182a0 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29  constraint (x>?)
182b0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61  .** results in a
182c0 20 72 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64   return of 4 and
182d0 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61   a range constra
182e0 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  int (x>? AND x<?
182f0 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20  ) results.** in 
18300 61 20 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a  a return of 16..
18310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
18320 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
18330 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18340 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
18350 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
18360 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18370 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
18380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18390 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  dex containing t
183a0 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
183b0 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f  d column; "x" */
183c0 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20  .  int nEq,     
183d0 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78          /* index
183e0 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20   into p->aCol[] 
183f0 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  of the range-com
18400 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  pared column */.
18410 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
18420 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
18430 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
18440 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
18450 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
18460 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
18470 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
18480 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
18490 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
184a0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
184b0 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e  /.  double *pRan
184c0 67 65 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20  geDiv   /* OUT: 
184d0 52 65 64 75 63 65 20 73 65 61 72 63 68 20 73 70  Reduce search sp
184e0 61 63 65 20 62 79 20 74 68 69 73 20 64 69 76 69  ace by this divi
184f0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sor */.){.  int 
18500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18520 4e 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69  NABLE_STAT3..  i
18530 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e  f( nEq==0 && p->
18540 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73  nSample ){.    s
18550 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
18560 61 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f  angeVal;.    tRo
18570 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
18580 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70  .    tRowcnt iUp
18590 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
185a0 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e  t[0];.    tRowcn
185b0 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61  t a[2];.    u8 a
185c0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
185d0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
185e0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a  [0]].affinity;..
185f0 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
18600 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
18610 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
18620 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
18630 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
18640 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
18650 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67  xpr, aff, &pRang
18660 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  eVal);.      ass
18670 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  ert( pLower->eOp
18680 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c  erator==WO_GT ||
18690 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
186a0 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20  or==WO_GE );.   
186b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
186c0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77  E_OK.       && w
186d0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
186e0 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61  rse, p, pRangeVa
186f0 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45  l, 0, a)==SQLITE
18700 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  _OK.      ){.   
18710 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b       iLower = a[
18720 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
18730 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
18740 72 3d 3d 57 4f 5f 47 54 20 29 20 69 4c 6f 77 65  r==WO_GT ) iLowe
18750 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  r += a[1];.     
18760 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
18770 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65  ValueFree(pRange
18780 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
18790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
187a0 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
187b0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
187c0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
187d0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
187e0 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
187f0 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
18800 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61  , aff, &pRangeVa
18810 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
18820 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ( pUpper->eOpera
18830 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55  tor==WO_LT || pU
18840 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
18850 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =WO_LE );.      
18860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18870 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65 72  K.       && wher
18880 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
18890 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20  , p, pRangeVal, 
188a0 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, a)==SQLITE_OK
188b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
188c0 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b    iUpper = a[0];
188d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 55 70  .        if( pUp
188e0 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
188f0 57 4f 5f 4c 45 20 29 20 69 55 70 70 65 72 20 2b  WO_LE ) iUpper +
18900 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  = a[1];.      }.
18910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
18920 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c  ueFree(pRangeVal
18930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18940 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18950 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55 70 70  {.      if( iUpp
18960 65 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20  er<=iLower ){.  
18970 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76        *pRangeDiv
18980 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69   = (double)p->ai
18990 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20  RowEst[0];.     
189a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
189b0 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f  *pRangeDiv = (do
189c0 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74  uble)p->aiRowEst
189d0 5b 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70  [0]/(double)(iUp
189e0 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20  per - iLower);. 
189f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45       }.      WHE
18a00 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65 20  RETRACE(("range 
18a10 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
18a20 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c  ..%u  div=%g\n",
18a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a40 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20     (u32)iLower, 
18a50 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52  (u32)iUpper, *pR
18a60 61 6e 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20  angeDiv));.     
18a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18a80 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  K;.    }.  }.#el
18a90 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
18aa0 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
18ab0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18ac0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
18ad0 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23  ARAMETER(nEq);.#
18ae0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
18af0 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
18b00 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76   );.  *pRangeDiv
18b10 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
18b20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70  if( pLower && (p
18b30 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26  Lower->wtFlags &
18b40 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
18b50 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20  ) *pRangeDiv *= 
18b60 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28  (double)4;.  if(
18b70 20 70 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67   pUpper ) *pRang
18b80 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29  eDiv *= (double)
18b90 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  4;.  return rc;.
18ba0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
18bb0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a  _ENABLE_STAT3./*
18bc0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
18bd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18be0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
18bf0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
18c00 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  * an equality co
18c10 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45  nstraint x=VALUE
18c20 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20   and where that 
18c30 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a  VALUE occurs in.
18c40 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  ** the histogram
18c50 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c   data.  This onl
18c60 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69  y works when x i
18c70 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  s the left-most.
18c80 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  ** column of an 
18c90 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65  index and sqlite
18ca0 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
18cb0 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
18cc0 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69  le.** for that i
18cd0 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70  ndex.  When pExp
18ce0 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  r==NULL that mea
18cf0 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ns the constrain
18d00 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55  t is.** "x IS NU
18d10 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  LL" instead of "
18d20 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20  x=VALUE"..**.** 
18d30 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
18d40 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
18d50 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
18d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
18d70 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
18d80 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
18d90 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
18da0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
18db0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
18dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18dd0 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
18de0 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
18df0 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
18e00 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
18e10 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
18e20 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
18e30 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
18e40 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
18e50 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
18e60 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
18e70 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
18e80 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
18e90 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
18ea0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
18eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
18ec0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
18ed0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18ee0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
18ef0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
18f00 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18f10 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
18f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18f30 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
18f40 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
18f50 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  erm */.  Expr *p
18f60 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
18f70 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
18f80 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
18f90 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
18fa0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
18fb0 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
18fc0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
18fd0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
18fe0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
18ff0 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30  _value *pRhs = 0
19000 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72  ;  /* VALUE on r
19010 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19020 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 75 38 20  f pTerm */.  u8 
19030 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
19040 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
19050 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69   affinity */.  i
19060 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19070 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
19080 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
19090 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ode */.  tRowcnt
190a0 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20   a[2];          
190b0 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73     /* Statistics
190c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
190d0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
190e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61    assert( p->nSa
190f0 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 66 66 20  mple>0 );.  aff 
19100 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
19110 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  l[p->aiColumn[0]
19120 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
19130 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72  ( pExpr ){.    r
19140 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
19150 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
19160 20 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20   aff, &pRhs);.  
19170 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
19180 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
19190 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73  t_cancel;.  }els
191a0 65 7b 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71  e{.    pRhs = sq
191b0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50  lite3ValueNew(pP
191c0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
191d0 20 69 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72   if( pRhs==0 ) r
191e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
191f0 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68  FOUND;.  rc = wh
19200 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
19210 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20  se, p, pRhs, 0, 
19220 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  a);.  if( rc==SQ
19230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 57  LITE_OK ){.    W
19240 48 45 52 45 54 52 41 43 45 28 28 22 65 71 75 61  HERETRACE(("equa
19250 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
19260 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
19270 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e 52 6f  [1]));.    *pnRo
19280 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a 77 68  w = a[1];.  }.wh
19290 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
192a0 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65  cancel:.  sqlite
192b0 33 56 61 6c 75 65 46 72 65 65 28 70 52 68 73 29  3ValueFree(pRhs)
192c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
192d0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
192e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
192f0 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69 66 64  _STAT3) */..#ifd
19300 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19310 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT3./*.** Est
19320 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
19330 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
19340 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
19350 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e  ased on.** an IN
19360 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72   constraint wher
19370 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
19380 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20   side of the IN 
19390 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61  operator.** is a
193a0 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e   list of values.
193b0 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
193c0 20 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20          WHERE x 
193d0 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a  IN (1,2,3,4).**.
193e0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74  ** Write the est
193f0 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74  imated row count
19400 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64   into *pnRow and
19410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19420 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65  K. .** If unable
19430 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69   to make an esti
19440 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52  mate, leave *pnR
19450 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ow unchanged and
19460 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
19470 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ero..**.** This 
19480 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c  routine can fail
19490 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65   if it is unable
194a0 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61   to load a colla
194b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ting sequence.**
194c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74   required for st
194d0 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c  ring comparison,
194e0 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f   or if unable to
194f0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
19500 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f  .** for a UTF co
19510 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65  nversion require
19520 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  d for comparison
19530 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  .  The error is 
19540 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
19550 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
19560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19570 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
19580 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19590 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
195a0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
195b0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
195c0 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
195d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
195e0 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
195f0 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
19600 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  erm */.  ExprLis
19610 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
19620 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
19630 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
19640 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
19650 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  .)" */.  double 
19660 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a  *pnRow        /*
19670 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
19680 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
19690 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
196a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
196b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66           /* Subf
196c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63  unction return c
196d0 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ode */.  double 
196e0 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  nEst;           
196f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19700 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
19710 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 64 6f  gle term */.  do
19720 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d 20 28  uble nRowEst = (
19730 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e 65 77  double)0; /* New
19740 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
19750 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19760 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19790 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
197a0 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a  ->aSample!=0 );.
197b0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
197c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c  QLITE_OK && i<pL
197d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
197e0 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70 2d 3e  {.    nEst = p->
197f0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
19800 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
19810 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
19820 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  p, pList->a[i].p
19830 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
19840 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
19850 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
19860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19870 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
19880 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
19890 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
198a0 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
198b0 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
198c0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
198d0 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
198e0 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e 52  e: est=%g\n", nR
198f0 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 72  owEst));.  }.  r
19900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19910 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
19920 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
19930 33 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69  3) */.../*.** Fi
19940 6e 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72  nd the best quer
19950 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73  y plan for acces
19960 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
19970 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  r table.  Write 
19980 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72  the.** best quer
19990 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63  y plan and its c
199a0 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65  ost into the Whe
199b0 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75  reCost object su
199c0 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a  pplied as the.**
199d0 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e   last parameter.
199e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73  .**.** The lowes
199f0 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73  t cost plan wins
19a00 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
19a10 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
19a20 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
19a30 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
19a40 6e 65 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73  needed to proces
19a50 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
19a60 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f  result..** Facto
19a70 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
19a80 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
19a90 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
19aa0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
19ab0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
19ac0 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
19ad0 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
19ae0 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
19af0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
19b00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
19b10 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
19b20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
19b30 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
19b40 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
19b50 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
19b60 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
19b70 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
19b80 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  n table..**.** I
19b90 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
19ba0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
19bb0 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20   (pSrc->pIndex) 
19bc0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
19bd0 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
19be0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
19bf0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19c00 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
19c10 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
19c20 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
19c30 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61  . If no such pla
19c40 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
19c50 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
19c60 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  st is.** SQLITE_
19c70 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c  BIG_DBL. If a pl
19c80 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  an is found that
19c90 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20   uses the named 
19ca0 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20  index, .** then 
19cb0 74 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63  the cost is calc
19cc0 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73  ulated in the us
19cd0 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  ual way..**.** I
19ce0 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  f a NOT INDEXED 
19cf0 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f  clause (pSrc->no
19d00 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73  tIndexed!=0) was
19d10 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
19d20 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68   table .** in th
19d30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19d40 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65  nt, then no inde
19d50 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  xes are consider
19d60 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
19d70 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c   .** selected pl
19d80 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b  an may still tak
19d90 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
19da0 68 65 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69  he built-in rowi
19db0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a  d primary key.**
19dc0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
19dd0 63 20 76 6f 69 64 20 62 65 73 74 42 74 72 65 65  c void bestBtree
19de0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
19df0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
19e00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
19e10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19e20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19e30 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
19e40 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
19e50 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
19e60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
19e70 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
19e80 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
19e90 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
19ea0 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
19eb0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
19ec0 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
19ed0 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69  lable for indexi
19ee0 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
19ef0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
19f00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
19f10 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
19f20 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
19f30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
19f40 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
19f50 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
19f60 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
19f70 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20  st *pDistinct,  
19f80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
19f90 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
19fa0 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
19fb0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
19fc0 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
19fd0 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
19fe0 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20  ery plan */.){. 
19ff0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1a000 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
1a010 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
1a020 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
1a030 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
1a040 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
1a050 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1a060 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
1a070 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
1a080 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1a090 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1a0a0 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
1a0b0 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
1a0c0 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
1a0d0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1a0e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
1a0f0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1a100 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1a110 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
1a120 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1a130 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
1a140 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1a150 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
1a160 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
1a170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
1a180 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
1a190 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
1a1a0 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  key */.  tRowcnt
1a1b0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
1a1c0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
1a1d0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
1a1e0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1a1f0 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
1a200 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
1a210 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
1a220 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1a230 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1a240 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
1a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1a260 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43  owed flags in pC
1a270 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1a280 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
1a290 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f  lize the cost to
1a2a0 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61   a worst-case va
1a2b0 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  lue */.  memset(
1a2c0 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pCost, 0, sizeof
1a2d0 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f  (*pCost));.  pCo
1a2e0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49  st->rCost = SQLI
1a2f0 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
1a300 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
1a310 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
1a320 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1a330 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
1a340 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
1a350 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
1a360 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
1a370 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
1a380 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
1a390 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
1a3a0 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
1a3b0 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
1a3c0 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
1a3d0 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
1a3e0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
1a3f0 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
1a400 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
1a410 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
1a420 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
1a430 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20   pSrc->jointype 
1a440 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
1a450 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1a460 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
1a470 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71  }else{.    idxEq
1a480 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
1a490 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1a4a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72  ;.  }..  if( pSr
1a4b0 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
1a4c0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
1a4d0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
1a4e0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1a4f0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
1a500 20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62      pIdx = pProb
1a510 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
1a520 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
1a530 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
1a540 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1a550 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
1a560 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
1a570 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b  rmMask;.  }else{
1a580 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
1a590 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
1a5a0 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
1a5b0 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
1a5c0 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
1a5d0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
1a5e0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
1a5f0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
1a600 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
1a610 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
1a620 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
1a630 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
1a640 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
1a650 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
1a660 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
1a670 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
1a680 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
1a6b0 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
1a6c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
1a6d0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
1a6e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
1a6f0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
1a700 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
1a710 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
1a720 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
1a730 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
1a740 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
1a750 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
1a760 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
1a770 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
1a780 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
1a790 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
1a7a0 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
1a7b0 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
1a7c0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
1a7d0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
1a7e0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
1a7f0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
1a800 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
1a810 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
1a820 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
1a830 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
1a840 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
1a850 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
1a860 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
1a870 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1a880 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
1a890 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
1a8a0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
1a8b0 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d  sPk;.    wsFlagM
1a8c0 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20  ask = ~(.       
1a8d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1a8e0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1a8f0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
1a900 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LL|WHERE_COLUMN_
1a910 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20  RANGE.    );.   
1a920 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
1a930 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70  _EQ|WO_IN;.    p
1a940 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Idx = 0;.  }..  
1a950 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
1a960 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67   indices looking
1a970 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e   for the best on
1a980 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
1a990 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49  for(; pProbe; pI
1a9a0 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  dx=pProbe=pProbe
1a9b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f  ->pNext){.    co
1a9c0 6e 73 74 20 74 52 6f 77 63 6e 74 20 2a 20 63 6f  nst tRowcnt * co
1a9d0 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70  nst aiRowEst = p
1a9e0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b  Probe->aiRowEst;
1a9f0 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
1aa00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aa10 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
1aa20 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20  g pProbe */.    
1aa30 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1aa50 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1aa60 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
1aa70 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75  t set */.    dou
1aa80 62 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28 64 6f  ble log10N = (do
1aa90 75 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61 73 65  uble)1;  /* base
1aaa0 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  -10 logarithm of
1aab0 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20   nRow (inexact) 
1aac0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20  */.    int rev; 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
1aaf0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1ab00 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77  der */.    int w
1ab10 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  sFlags = 0;.    
1ab20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
1ab30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
1ab40 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1ab50 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
1ab60 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f  based on the pro
1ab70 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a  perties of.    *
1ab80 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  * index being ev
1ab90 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72  aluated. They ar
1aba0 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64  e then used to d
1abb0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70  etermine the exp
1abc0 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73  ected.    ** cos
1abd0 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  t and number of 
1abe0 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  rows returned.. 
1abf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45     **.    **  nE
1ac00 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1ac10 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1ac20 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1ac30 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1ac40 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1ac50 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1ac60 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1ac70 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1ac80 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1ac90 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1aca0 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1acb0 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1acc0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1acd0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1ace0 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1acf0 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1ad00 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1ad10 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1ad20 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1ad30 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1ad40 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1ad50 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1ad60 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1ad70 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1ad80 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1ad90 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1ada0 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1adb0 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1adc0 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1add0 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1ade0 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1adf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ae00 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1ae10 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1ae20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1ae30 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1ae40 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1ae50 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1ae60 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1ae70 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1ae80 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1ae90 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1aea0 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1aeb0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1aec0 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1aed0 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1aee0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1aef0 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1af00 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1af10 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1af20 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1af30 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1af40 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1af50 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1af60 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1af70 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1af80 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1af90 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1afa0 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1afb0 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1afc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1afd0 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1afe0 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1aff0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1b000 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1b010 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1b020 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1b030 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1b040 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1b050 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1b060 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1b070 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1b080 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1b090 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1b0a0 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1b0b0 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1b0c0 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1b0d0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1b0e0 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20 20 20    rangeDiv:.    
1b0f0 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1b100 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72 20 62  e of a divisor b
1b110 79 20 77 68 69 63 68 20 74 6f 20 72 65 64 75 63  y which to reduc
1b120 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
1b130 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20 20 20  ce due.    **   
1b140 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   to inequality c
1b150 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49 6e 20  onstraints.  In 
1b160 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
1b170 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
1b180 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20 64 61  YZE.    **    da
1b190 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
1b1a0 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
1b1b0 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1b1c0 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a 20 20   to 1/4rd its.  
1b1d0 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e 61 6c    **    original
1b1e0 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69 76 3d   size (rangeDiv=
1b1f0 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71 75 61  =4).  Two inequa
1b200 6c 69 74 69 65 73 20 72 65 64 75 63 65 20 74 68  lities reduce th
1b210 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
1b220 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 31 36     space to 1/16
1b230 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e  th of its origin
1b240 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1b250 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a 0a 20  v==16)..    **. 
1b260 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1b270 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1b280 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1b290 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1b2a0 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1b2b0 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1b2c0 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1b2d0 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1b2e0 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1b2f0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1b300 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1b310 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1b320 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1b330 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f   **.    **  bLoo
1b340 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  kup: .    **    
1b350 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
1b360 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20   a table lookup 
1b370 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1b380 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79  each index entry
1b390 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74  .    **    visit
1b3a0 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ed.  In other wo
1b3b0 72 64 73 2c 20 74 72 75 65 20 69 66 20 74 68 69  rds, true if thi
1b3c0 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72  s is not a cover
1b3d0 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  ing index..    *
1b3e0 2a 20 20 20 20 54 68 69 73 20 69 73 20 61 6c 77  *    This is alw
1b3f0 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68  ays false for th
1b400 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
1b410 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74  key index of a t
1b420 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  able..    **    
1b430 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65  For other indexe
1b440 73 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e  s, it is true un
1b450 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c  less all the col
1b460 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
1b470 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64  e.    **    used
1b480 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
1b490 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65  tatement are pre
1b4a0 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65  sent in the inde
1b4b0 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a  x (such an.    *
1b4c0 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f  *    index is so
1b4d0 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69 62 65  metimes describe
1b4e0 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  d as a covering 
1b4f0 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20  index)..    **  
1b500 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67    For example, g
1b510 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  iven the index o
1b520 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65  n (a, b), the se
1b530 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c  cond of the foll
1b540 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20  owing .    **   
1b550 20 74 77 6f 20 71 75 65 72 69 65 73 20 72 65 71   two queries req
1b560 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72  uires table b-tr
1b570 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72  ee lookups in or
1b580 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20  der to find the 
1b590 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20  value.    **    
1b5a0 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74  of column c, but
1b5b0 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73 20   the first does 
1b5c0 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75  not because colu
1b5d0 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a  mns a and b are.
1b5e0 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61      **    both a
1b5f0 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1b600 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1b610 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1b620 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20   SELECT a, b    
1b630 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
1b640 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20   = 1;.    **    
1b650 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
1b660 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c  a, b, c FROM tbl
1b670 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
1b680 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71    */.    int nEq
1b690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b6a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b6b0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1b6c0 6d 73 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  ms matching inde
1b6d0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e  x */.    int bIn
1b6e0 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Est = 0;        
1b6f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b700 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  f "x IN (SELECT.
1b710 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ..)" seen */.   
1b720 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b   int nInMul = 1;
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b740 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74  * Number of dist
1b750 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65 73 20  inct equalities 
1b760 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20  to lookup */.   
1b770 20 64 6f 75 62 6c 65 20 72 61 6e 67 65 44 69 76   double rangeDiv
1b780 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f   = (double)1;  /
1b790 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65 64 75  * Estimated redu
1b7a0 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20  ction in search 
1b7b0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74  space */.    int
1b7c0 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   nBound = 0;    
1b7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b7e0 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f  mber of range co
1b7f0 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a  nstraints seen *
1b800 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f 72 74 20  /.    int bSort 
1b810 3d 20 21 21 70 4f 72 64 65 72 42 79 3b 20 20 20  = !!pOrderBy;   
1b820 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
1b830 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71  xternal sort req
1b840 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  uired */.    int
1b850 20 62 44 69 73 74 20 3d 20 21 21 70 44 69 73 74   bDist = !!pDist
1b860 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  inct;      /* Tr
1b870 75 65 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e  ue if index cann
1b880 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44 49 53  ot help with DIS
1b890 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  TINCT */.    int
1b8a0 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20   bLookup = 0;   
1b8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b8c0 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65  ue if not a cove
1b8d0 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1b8e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1b8f0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1b900 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
1b910 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1b920 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  ause */.#ifdef S
1b930 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1b940 54 33 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  T3.    WhereTerm
1b950 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30   *pFirstTerm = 0
1b960 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65  ;    /* First te
1b970 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  rm matching the 
1b980 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a  index */.#endif.
1b990 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
1b9a0 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1b9b0 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a  nEq and nInMul *
1b9c0 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b  /.    for(nEq=0;
1b9d0 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
1b9e0 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20  lumn; nEq++){.  
1b9f0 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
1ba00 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
1ba10 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
1ba20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1ba30 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
1ba40 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49  , eqTermMask, pI
1ba50 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
1ba60 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
1ba70 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
1ba80 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1ba90 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  EQ|WHERE_ROWID_E
1baa0 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
1bab0 73 65 28 20 70 54 65 72 6d 2d 3e 70 57 43 21 3d  se( pTerm->pWC!=
1bac0 70 57 43 20 29 3b 0a 20 20 20 20 20 20 69 66 28  pWC );.      if(
1bad0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1bae0 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
1baf0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1bb00 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1bb10 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1bb20 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
1bb30 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
1bb40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1bb50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1bb60 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1bb70 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
1bb80 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75  ECT ...)":  Assu
1bb90 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  me the SELECT re
1bba0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1bbc0 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
1bbd0 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
1bbe0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1bbf0 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
1bc00 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
1bc10 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1bc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1bc30 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
1bc40 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
1bc50 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1bc60 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  *= pExpr->x.pLis
1bc70 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1bc80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1bc90 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1bca0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1bcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1bcc0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
1bcd0 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
1bce0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1bcf0 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
1bd00 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26     if( nEq==0 &&
1bd10 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65   pProbe->aSample
1bd20 20 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20   ) pFirstTerm = 
1bd30 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  pTerm;.#endif.  
1bd40 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72      used |= pTer
1bd50 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1bd60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
1bd70 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
1bd80 65 20 6f 66 20 72 61 6e 67 65 44 69 76 20 2a 2f  e of rangeDiv */
1bd90 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
1bda0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  obe->nColumn && 
1bdb0 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
1bdc0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ed==0 ){.      i
1bdd0 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
1bde0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
1bdf0 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
1be00 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
1be10 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
1be20 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
1be30 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
1be40 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1be50 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  op = findTerm(pW
1be60 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
1be70 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
1be80 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1be90 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74    WhereTerm *pBt
1bea0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1beb0 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1bec0 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
1bed0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1bee0 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
1bef0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1bf00 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54  e, nEq, pBtm, pT
1bf10 6f 70 2c 20 26 72 61 6e 67 65 44 69 76 29 3b 0a  op, &rangeDiv);.
1bf20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 70          if( pTop
1bf30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42   ){.          nB
1bf40 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
1bf50 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1bf60 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
1bf70 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c            used |
1bf80 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69  = pTop->prereqRi
1bf90 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  ght;.          t
1bfa0 65 73 74 63 61 73 65 28 20 70 54 6f 70 2d 3e 70  estcase( pTop->p
1bfb0 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20  WC!=pWC );.     
1bfc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1bfd0 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20   pBtm ){.       
1bfe0 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20     nBound++;.   
1bff0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1c000 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
1c010 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73 65  T;.          use
1c020 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65  d |= pBtm->prere
1c030 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
1c040 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 6d    testcase( pBtm
1c050 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20  ->pWC!=pWC );.  
1c060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c070 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
1c080 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
1c090 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1c0a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c0b0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
1c0c0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1c0d0 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  e ){.      testc
1c0e0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
1c0f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
1c100 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c110 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
1c120 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b  E_COLUMN_NULL );
1c130 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c  .      if( (wsFl
1c140 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
1c150 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
1c160 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b  UMN_NULL))==0 ){
1c170 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1c180 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
1c190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c1a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1c1b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1c1c0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69  clause and the i
1c1d0 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69  ndex being consi
1c1e0 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a  dered will.    *
1c1f0 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e  * naturally scan
1c200 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
1c210 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74  uired order, set
1c220 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1c230 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e   flags.    ** in
1c240 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
1c250 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
1c260 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1c270 75 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65  use but the inde
1c280 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63  x.    ** will sc
1c290 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
1c2a0 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
1c2b0 74 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69  t the bSort vari
1c2c0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
1c2d0 28 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  ( isSortingIndex
1c2e0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
1c2f0 73 65 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  se, pWC->pMaskSe
1c300 74 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c  t, pProbe, iCur,
1c310 20 70 4f 72 64 65 72 42 79 2c 20 6e 45 71 2c 20   pOrderBy, nEq, 
1c320 77 73 46 6c 61 67 73 2c 20 26 72 65 76 29 0a 20  wsFlags, &rev). 
1c330 20 20 20 29 7b 0a 20 20 20 20 20 20 62 53 6f 72     ){.      bSor
1c340 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 73 46  t = 0;.      wsF
1c350 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f  lags |= WHERE_RO
1c360 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  WID_RANGE|WHERE_
1c370 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
1c380 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
1c390 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65    wsFlags |= (re
1c3a0 76 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53  v ? WHERE_REVERS
1c3b0 45 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  E : 0);.    }.. 
1c3c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1c3d0 73 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61  s a DISTINCT qua
1c3e0 6c 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20  lifier and this 
1c3f0 69 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20  index will scan 
1c400 72 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f  rows in.    ** o
1c410 72 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54  rder of the DIST
1c420 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73  INCT expressions
1c430 2c 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e  , clear bDist an
1c440 64 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70  d set the approp
1c450 72 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61  riate.    ** fla
1c460 67 73 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 2a  gs in wsFlags. *
1c470 2f 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74  /.    if( isDist
1c480 69 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65  inctIndex(pParse
1c490 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69  , pWC, pProbe, i
1c4a0 43 75 72 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  Cur, pDistinct, 
1c4b0 6e 45 71 29 20 29 7b 0a 20 20 20 20 20 20 62 44  nEq) ){.      bD
1c4c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  ist = 0;.      w
1c4d0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
1c4e0 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52  ROWID_RANGE|WHER
1c4f0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
1c500 48 45 52 45 5f 44 49 53 54 49 4e 43 54 3b 0a 20  HERE_DISTINCT;. 
1c510 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c520 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c  currently calcul
1c530 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f  ating the cost o
1c540 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
1c550 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20   (not the IPK.  
1c560 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74    ** index), det
1c570 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65  ermine if all re
1c580 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61  quired column da
1c590 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ta may be obtain
1c5a0 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20  ed without .    
1c5b0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69  ** using the mai
1c5c0 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66  n table (i.e. if
1c5d0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20   the index is a 
1c5e0 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20  covering.    ** 
1c5f0 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71  index for this q
1c600 75 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c  uery). If it is,
1c610 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49   set the WHERE_I
1c620 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a  DX_ONLY flag in.
1c630 20 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20      ** wsFlags. 
1c640 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 74  Otherwise, set t
1c650 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61  he bLookup varia
1c660 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f  ble to true.  */
1c670 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
1c680 20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20   wsFlags ){.    
1c690 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
1c6a0 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
1c6b0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
1c6c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
1c6d0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
1c6e0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
1c6f0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
1c700 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
1c710 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
1c720 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
1c730 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
1c740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c750 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
1c760 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1c770 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
1c780 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
1c790 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
1c7a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1c7b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1c7c0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
1c7d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
1c7e0 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
1c7f0 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  n "x IN (SELECT.
1c800 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  ..)".    ** cons
1c810 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c  traint, do not l
1c820 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1c830 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65 20  exceed half the 
1c840 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1c850 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  e..    */.    nR
1c860 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69  ow = (double)(ai
1c870 52 6f 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e 49  RowEst[nEq] * nI
1c880 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  nMul);.    if( b
1c890 49 6e 45 73 74 20 26 26 20 6e 52 6f 77 2a 32 3e  InEst && nRow*2>
1c8a0 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20  aiRowEst[0] ){. 
1c8b0 20 20 20 20 20 6e 52 6f 77 20 3d 20 61 69 52 6f       nRow = aiRo
1c8c0 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20  wEst[0]/2;.     
1c8d0 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28   nInMul = (int)(
1c8e0 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b  nRow / aiRowEst[
1c8f0 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  nEq]);.    }..#i
1c900 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c910 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 2f 2a 20  LE_STAT3.    /* 
1c920 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  If the constrain
1c930 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1c940 20 78 3d 56 41 4c 55 45 20 6f 72 20 78 20 49 4e   x=VALUE or x IN
1c950 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a 20 20 20   (E1,E2,...).   
1c960 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f   ** and we do no
1c970 74 20 74 68 69 6e 6b 20 74 68 61 74 20 76 61 6c  t think that val
1c980 75 65 73 20 6f 66 20 78 20 61 72 65 20 75 6e 69  ues of x are uni
1c990 71 75 65 20 61 6e 64 20 69 66 20 68 69 73 74 6f  que and if histo
1c9a0 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1c9b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1c9c0 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1c9d0 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1c9e0 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1c9f0 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1ca00 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1ca10 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1ca20 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1ca30 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1ca40 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1ca50 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1ca60 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1ca70 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 28  /.    if( nRow>(
1ca80 64 6f 75 62 6c 65 29 31 20 26 26 20 6e 45 71 3d  double)1 && nEq=
1ca90 3d 31 20 26 26 20 70 46 69 72 73 74 54 65 72 6d  =1 && pFirstTerm
1caa0 21 3d 30 20 26 26 20 61 69 52 6f 77 45 73 74 5b  !=0 && aiRowEst[
1cab0 31 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73  1]>1 ){.      as
1cac0 73 65 72 74 28 20 28 70 46 69 72 73 74 54 65 72  sert( (pFirstTer
1cad0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1cae0 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c  WO_EQ|WO_ISNULL|
1caf0 57 4f 5f 49 4e 29 29 21 3d 30 20 29 3b 0a 20 20  WO_IN))!=0 );.  
1cb00 20 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65      if( pFirstTe
1cb10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1cb20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
1cb30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  ) ){.        tes
1cb40 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
1cb50 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1cb60 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
1cb70 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54  estcase( pFirstT
1cb80 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
1cb90 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
1cba0 20 20 20 20 20 77 68 65 72 65 45 71 75 61 6c 53       whereEqualS
1cbb0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
1cbc0 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72  Probe, pFirstTer
1cbd0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1cbe0 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  , &nRow);.      
1cbf0 7d 65 6c 73 65 20 69 66 28 20 62 49 6e 45 73 74  }else if( bInEst
1cc00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1cc10 73 73 65 72 74 28 20 70 46 69 72 73 74 54 65 72  ssert( pFirstTer
1cc20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1cc30 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 77  _IN );.        w
1cc40 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
1cc50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1cc60 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1cc70 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29  >x.pList, &nRow)
1cc80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1cca0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f  _ENABLE_STAT3 */
1ccb0 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20  ..    /* Adjust 
1ccc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
1ccd0 74 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f  tput rows and do
1cce0 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63  wnward to reflec
1ccf0 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68  t rows.    ** th
1cd00 61 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  at are excluded 
1cd10 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  by range constra
1cd20 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
1cd30 20 6e 52 6f 77 20 3d 20 6e 52 6f 77 2f 72 61 6e   nRow = nRow/ran
1cd40 67 65 44 69 76 3b 0a 20 20 20 20 69 66 28 20 6e  geDiv;.    if( n
1cd50 52 6f 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31  Row<1 ) nRow = 1
1cd60 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69  ;..    /* Experi
1cd70 6d 65 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61  ments run on rea
1cd80 6c 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  l SQLite databas
1cd90 65 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  es show that the
1cda0 20 74 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20   time needed.   
1cdb0 20 2a 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61   ** to do a bina
1cdc0 72 79 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63  ry search to loc
1cdd0 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74  ate a row in a t
1cde0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
1cdf0 20 72 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20   roughly.    ** 
1ce00 6c 6f 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74  log10(N) times t
1ce10 68 65 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20  he time to move 
1ce20 66 72 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20  from one row to 
1ce30 74 68 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74  the next row wit
1ce40 68 69 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  hin.    ** a tab
1ce50 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68  le or index.  Th
1ce60 65 20 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63  e actual times c
1ce70 61 6e 20 76 61 72 79 2c 20 77 69 74 68 20 74 68  an vary, with th
1ce80 65 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  e size of.    **
1ce90 20 72 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61   records being a
1cea0 6e 20 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74  n important fact
1ceb0 6f 72 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20  or.  Both moves 
1cec0 61 6e 64 20 73 65 61 72 63 68 65 73 20 61 72 65  and searches are
1ced0 0a 20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77  .    ** slower w
1cee0 69 74 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72  ith larger recor
1cef0 64 73 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62  ds, presumably b
1cf00 65 63 61 75 73 65 20 66 65 77 65 72 20 72 65 63  ecause fewer rec
1cf10 6f 72 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20  ords fit.    ** 
1cf20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20  on one page and 
1cf30 68 65 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73  hence more pages
1cf40 20 68 61 76 65 20 74 6f 20 62 65 20 66 65 74 63   have to be fetc
1cf50 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
1cf60 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63  ** The ANALYZE c
1cf70 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73  ommand and the s
1cf80 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20  qlite_stat1 and 
1cf90 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
1cfa0 6c 65 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  les do.    ** no
1cfb0 74 20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f  t give us data o
1cfc0 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
1cfd0 69 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e  izes of table an
1cfe0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
1cff0 0a 20 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20  .    ** So this 
1d000 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75  computation assu
1d010 6d 65 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64  mes table record
1d020 73 20 61 72 65 20 61 62 6f 75 74 20 74 77 69 63  s are about twic
1d030 65 20 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20  e as big.    ** 
1d040 61 73 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  as index records
1d050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d060 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  (wsFlags & WHERE
1d070 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
1d080 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1d090 65 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c  e cost of a full
1d0a0 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61   table scan is a
1d0b0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20   number of move 
1d0c0 6f 70 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c  operations equal
1d0d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
1d0e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1d0f0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  in the table..  
1d100 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d110 57 65 20 61 64 64 20 61 6e 20 61 64 64 69 74 69  We add an additi
1d120 6f 6e 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20  onal 4x penalty 
1d130 74 6f 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63  to full table sc
1d140 61 6e 73 2e 20 20 54 68 69 73 20 63 61 75 73 65  ans.  This cause
1d150 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  s.      ** the c
1d160 6f 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ost function to 
1d170 65 72 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20  err on the side 
1d180 6f 66 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69  of choosing an i
1d190 6e 64 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20  ndex over.      
1d1a0 2a 2a 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75  ** choosing a fu
1d1b0 6c 6c 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34  ll scan.  This 4
1d1c0 78 20 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61  x full-scan pena
1d1d0 6c 74 79 20 69 73 20 61 6e 20 61 72 67 75 61 62  lty is an arguab
1d1e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69  le.      ** deci
1d1f0 73 69 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69  sion and one whi
1d200 63 68 20 77 65 20 65 78 70 65 63 74 20 74 6f 20  ch we expect to 
1d210 72 65 76 69 73 69 74 20 69 6e 20 74 68 65 20 66  revisit in the f
1d220 75 74 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20  uture.  But.    
1d230 20 20 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f    ** it seems to
1d240 20 62 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c   be working well
1d250 20 65 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d   enough at the m
1d260 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  oment..      */.
1d270 20 20 20 20 20 20 63 6f 73 74 20 3d 20 61 69 52        cost = aiR
1d280 6f 77 45 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20  owEst[0]*4;.    
1d290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67  }else{.      log
1d2a0 31 30 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52  10N = estLog(aiR
1d2b0 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20  owEst[0]);.     
1d2c0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20   cost = nRow;.  
1d2d0 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
1d2e0 20 20 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f          if( bLoo
1d2f0 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kup ){.         
1d300 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78   /* For an index
1d310 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64   lookup followed
1d320 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   by a table look
1d330 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  up:.          **
1d340 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78      nInMul index
1d350 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e   searches to fin
1d360 64 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  d the start of e
1d370 61 63 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a  ach index range.
1d380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20            **  + 
1d390 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75  nRow steps throu
1d3a0 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  gh the index.   
1d3b0 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f         **  + nRo
1d3c0 77 20 74 61 62 6c 65 20 73 65 61 72 63 68 65 73  w table searches
1d3d0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74   to lookup the t
1d3e0 61 62 6c 65 20 65 6e 74 72 79 20 75 73 69 6e 67  able entry using
1d3f0 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20   the rowid.     
1d400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d410 20 20 63 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75    cost += (nInMu
1d420 6c 20 2b 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e  l + nRow)*log10N
1d430 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d440 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
1d450 72 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  r a covering ind
1d460 65 78 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ex:.          **
1d470 20 20 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65       nInMul inde
1d480 78 20 73 65 61 72 63 68 65 73 20 74 6f 20 66 69  x searches to fi
1d490 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65  nd the initial e
1d4a0 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 20 20  ntry .          
1d4b0 2a 2a 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70  **   + nRow step
1d4c0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  s through the in
1d4d0 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  dex.          */
1d4e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
1d4f0 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e  += nInMul*log10N
1d500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d520 20 2f 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20   /* For a rowid 
1d530 70 72 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b  primary key look
1d540 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  up:.        **  
1d550 20 20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20    nInMult table 
1d560 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1d570 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1d580 72 79 20 66 6f 72 20 65 61 63 68 20 72 61 6e 67  ry for each rang
1d590 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20  e.        **  + 
1d5a0 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75  nRow steps throu
1d5b0 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  gh the table.   
1d5c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d5d0 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  cost += nInMul*l
1d5e0 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  og10N;.      }. 
1d5f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1d600 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
1d610 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
1d620 67 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41  g the result.  A
1d630 63 74 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74  ctual experiment
1d640 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72  al.    ** measur
1d650 65 6d 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e  ements of sortin
1d660 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e  g performance in
1d670 20 53 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61   SQLite show tha
1d680 74 20 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20  t sorting time. 
1d690 20 20 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c     ** adds C*N*l
1d6a0 6f 67 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63  og10(N) to the c
1d6b0 6f 73 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ost, where N is 
1d6c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1d6d0 77 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ws to be .    **
1d6e0 20 73 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73   sorted and C is
1d6f0 20 61 20 66 61 63 74 6f 72 20 62 65 74 77 65 65   a factor betwee
1d700 6e 20 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20  n 1.95 and 4.3. 
1d710 20 57 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74   We will split t
1d720 68 65 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72  he.    ** differ
1d730 65 6e 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20  ence and select 
1d740 43 20 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f  C of 3.0..    */
1d750 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
1d760 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
1d770 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
1d780 29 2a 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )*3;.    }.    i
1d790 66 28 20 62 44 69 73 74 20 29 7b 0a 20 20 20 20  f( bDist ){.    
1d7a0 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65    cost += nRow*e
1d7b0 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20  stLog(nRow)*3;. 
1d7c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20     }..    /**** 
1d7d0 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68  Cost of using th
1d7e0 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77  is index has now
1d7f0 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a   been computed *
1d800 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ***/..    /* If 
1d810 74 68 65 72 65 20 61 72 65 20 61 64 64 69 74 69  there are additi
1d820 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73  onal constraints
1d830 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   on this table t
1d840 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a  hat cannot.    *
1d850 2a 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  * be used with t
1d860 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78  he current index
1d870 2c 20 62 75 74 20 77 68 69 63 68 20 6d 69 67 68  , but which migh
1d880 74 20 6c 6f 77 65 72 20 74 68 65 20 6e 75 6d 62  t lower the numb
1d890 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74  er.    ** of out
1d8a0 70 75 74 20 72 6f 77 73 2c 20 61 64 6a 75 73 74  put rows, adjust
1d8b0 20 74 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   the nRow value 
1d8c0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20 54 68  accordingly.  Th
1d8d0 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20  is only .    ** 
1d8e0 6d 61 74 74 65 72 73 20 69 66 20 74 68 65 20 63  matters if the c
1d8f0 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20  urrent index is 
1d900 74 68 65 20 6c 65 61 73 74 20 63 6f 73 74 6c 79  the least costly
1d910 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68  , so do not both
1d920 65 72 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  er.    ** with t
1d930 68 69 73 20 73 74 65 70 20 69 66 20 77 65 20 61  his step if we a
1d940 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 69 73  lready know this
1d950 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
1d960 62 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20 20 2a  be chosen..    *
1d970 2a 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20 72 65  * Also, never re
1d980 64 75 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  duce the output 
1d990 72 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  row count below 
1d9a0 32 20 75 73 69 6e 67 20 74 68 69 73 20 73 74 65  2 using this ste
1d9b0 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p..    **.    **
1d9c0 20 49 74 20 69 73 20 63 72 69 74 69 63 61 6c 20   It is critical 
1d9d0 74 68 61 74 20 74 68 65 20 6e 6f 74 56 61 6c 69  that the notVali
1d9e0 64 20 6d 61 73 6b 20 62 65 20 75 73 65 64 20 68  d mask be used h
1d9f0 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  ere instead of. 
1da00 20 20 20 2a 2a 20 74 68 65 20 6e 6f 74 52 65 61     ** the notRea
1da10 64 79 20 6d 61 73 6b 2e 20 20 57 68 65 6e 20 63  dy mask.  When c
1da20 6f 6d 70 75 74 69 6e 67 20 61 6e 20 22 6f 70 74  omputing an "opt
1da30 69 6d 61 6c 22 20 69 6e 64 65 78 2c 20 74 68 65  imal" index, the
1da40 20 6e 6f 74 52 65 61 64 79 0a 20 20 20 20 2a 2a   notReady.    **
1da50 20 6d 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20   mask will only 
1da60 68 61 76 65 20 6f 6e 65 20 62 69 74 20 73 65 74  have one bit set
1da70 20 2d 20 74 68 65 20 62 69 74 20 66 6f 72 20 74   - the bit for t
1da80 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
1da90 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 6f 74  ..    ** The not
1daa0 56 61 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e 20 74  Valid mask, on t
1dab0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 61  he other hand, a
1dac0 6c 77 61 79 73 20 68 61 73 20 61 6c 6c 20 62 69  lways has all bi
1dad0 74 73 20 73 65 74 20 66 6f 72 0a 20 20 20 20 2a  ts set for.    *
1dae0 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72  * tables that ar
1daf0 65 20 6e 6f 74 20 69 6e 20 6f 75 74 65 72 20 6c  e not in outer l
1db00 6f 6f 70 73 2e 20 20 49 66 20 6e 6f 74 52 65 61  oops.  If notRea
1db10 64 79 20 69 73 20 75 73 65 64 20 68 65 72 65 20  dy is used here 
1db20 69 6e 73 74 65 61 64 0a 20 20 20 20 2a 2a 20 6f  instead.    ** o
1db30 66 20 6e 6f 74 56 61 6c 69 64 2c 20 74 68 65 6e  f notValid, then
1db40 20 61 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78   a optimal index
1db50 20 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e   that depends on
1db60 20 69 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f   inner joins loo
1db70 70 73 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  ps.    ** might 
1db80 62 65 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e  be selected even
1db90 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
1dba0 74 73 20 61 6e 20 6f 70 74 69 6d 61 6c 20 69 6e  ts an optimal in
1dbb0 64 65 78 20 74 68 61 74 20 68 61 73 0a 20 20 20  dex that has.   
1dbc0 20 2a 2a 20 6e 6f 20 73 75 63 68 20 64 65 70 65   ** no such depe
1dbd0 6e 64 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20  ndency..    */. 
1dbe0 20 20 20 69 66 28 20 6e 52 6f 77 3e 32 20 26 26     if( nRow>2 &&
1dbf0 20 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43   cost<=pCost->rC
1dc00 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ost ){.      int
1dc10 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
1dc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1dc30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1dc40 20 20 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d     int nSkipEq =
1dc50 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
1dc60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
1dc70 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73  constraints to s
1dc80 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  kip */.      int
1dc90 20 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42   nSkipRange = nB
1dca0 6f 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ound;     /* Num
1dcb0 62 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61  ber of < constra
1dcc0 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
1dcd0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68        Bitmask th
1dce0 69 73 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  isTab;          
1dcf0 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72     /* Bitmap for
1dd00 20 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20   pSrc */..      
1dd10 74 68 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73  thisTab = getMas
1dd20 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
1dd30 20 69 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f   iCur);.      fo
1dd40 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
1dd50 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52  k=pWC->nTerm; nR
1dd60 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20  ow>2 && k; k--, 
1dd70 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1dd80 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1dd90 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1dda0 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UAL ) continue;.
1ddb0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
1ddc0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
1ddd0 6e 6f 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54  notValid)!=thisT
1dde0 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
1ddf0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1de00 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1de10 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
1de20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
1de30 20 20 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29     if( nSkipEq )
1de40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1de50 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1de60 74 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d  t nEq equality m
1de70 61 74 63 68 65 73 20 73 69 6e 63 65 20 74 68 65  atches since the
1de80 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
1de90 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
1dea0 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20  y accounted for 
1deb0 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  these */.       
1dec0 20 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a       nSkipEq--;.
1ded0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1dee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1def0 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69  Assume each addi
1df00 74 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20  tional equality 
1df10 6d 61 74 63 68 20 72 65 64 75 63 65 73 20 74 68  match reduces th
1df20 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
1df30 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65       ** set size
1df40 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
1df50 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  10 */.          
1df60 20 20 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20    nRow /= 10;.  
1df70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
1df90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
1dfa0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
1dfb0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
1dfc0 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52        if( nSkipR
1dfd0 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
1dfe0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
1dff0 65 20 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e  e first nSkipRan
1e000 67 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ge range constra
1e010 69 6e 74 73 20 73 69 6e 63 65 20 74 68 65 20 69  ints since the i
1e020 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
1e030 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
1e040 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68  accounted for th
1e050 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ese */.         
1e060 20 20 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b     nSkipRange--;
1e070 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e090 20 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64   Assume each add
1e0a0 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f  itional range co
1e0b0 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
1e0c0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
1e0d0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73          ** set s
1e0e0 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ize by a factor 
1e0f0 6f 66 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72  of 3.  Indexed r
1e100 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1e110 20 72 65 64 75 63 65 0a 20 20 20 20 20 20 20 20   reduce.        
1e120 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63      ** the searc
1e130 68 20 73 70 61 63 65 20 62 79 20 61 20 6c 61 72  h space by a lar
1e140 67 65 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20  ger factor: 4.  
1e150 57 65 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20  We make indexed 
1e160 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  range.          
1e170 20 20 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74    ** more select
1e180 69 76 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c  ive intentionall
1e190 79 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  y because of the
1e1a0 20 73 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20   subjective .   
1e1b0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65           ** obse
1e1c0 72 76 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64  rvation that ind
1e1d0 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  exed range const
1e1e0 72 61 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72  raints really ar
1e1f0 65 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20  e more.         
1e200 20 20 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20     ** selective 
1e210 69 6e 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20  in practice, on 
1e220 61 76 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20  average. */.    
1e230 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20          nRow /= 
1e240 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
1e250 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e260 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e270 72 21 3d 57 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20  r!=WO_NOOP ){.  
1e280 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f          /* Any o
1e290 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1e2a0 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74 70 75  lowers the outpu
1e2b0 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68  t row count by h
1e2c0 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  alf */.         
1e2d0 20 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20   nRow /= 2;.    
1e2e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e2f0 20 20 20 20 69 66 28 20 6e 52 6f 77 3c 32 20 29      if( nRow<2 )
1e300 20 6e 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d   nRow = 2;.    }
1e310 0a 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  ...    WHERETRAC
1e320 45 28 28 0a 20 20 20 20 20 20 22 25 73 28 25 73  E((.      "%s(%s
1e330 29 3a 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c  ): nEq=%d nInMul
1e340 3d 25 64 20 72 61 6e 67 65 44 69 76 3d 25 64 20  =%d rangeDiv=%d 
1e350 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70  bSort=%d bLookup
1e360 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78 25 78  =%d wsFlags=0x%x
1e370 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  \n".      "     
1e380 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25      notReady=0x%
1e390 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20  llx log10N=%.1f 
1e3a0 6e 52 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25  nRow=%.1f cost=%
1e3b0 2e 31 66 20 75 73 65 64 3d 30 78 25 6c 6c 78 5c  .1f used=0x%llx\
1e3c0 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  n",.      pSrc->
1e3d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49  pTab->zName, (pI
1e3e0 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
1e3f0 20 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20   : "ipk"), .    
1e400 20 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28    nEq, nInMul, (
1e410 69 6e 74 29 72 61 6e 67 65 44 69 76 2c 20 62 53  int)rangeDiv, bS
1e420 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73  ort, bLookup, ws
1e430 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f 74  Flags,.      not
1e440 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 6e  Ready, log10N, n
1e450 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a  Row, cost, used.
1e460 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
1e470 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
1e480 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
1e490 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
1e4a0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
1e4b0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
1e4c0 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
1e4d0 20 70 43 6f 73 74 20 73 74 72 75 63 74 75 72 65   pCost structure
1e4e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e4f0 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61   (!pIdx || wsFla
1e500 67 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73  gs).     && (cos
1e510 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c  t<pCost->rCost |
1e520 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e  | (cost<=pCost->
1e530 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70 43  rCost && nRow<pC
1e540 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29 29  ost->plan.nRow))
1e550 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1e560 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73  ost->rCost = cos
1e570 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  t;.      pCost->
1e580 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20  used = used;.   
1e590 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
1e5a0 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
1e5b0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
1e5c0 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73  Flags = (wsFlags
1e5d0 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20  &wsFlagMask);.  
1e5e0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1e5f0 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  nEq = nEq;.     
1e600 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1e610 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
1e620 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1e630 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
1e640 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
1e650 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
1e660 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
1e670 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
1e680 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
1e690 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  dex ) break;..  
1e6a0 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73    /* Reset masks
1e6b0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e   for the next in
1e6c0 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
1e6d0 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  */.    wsFlagMas
1e6e0 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49  k = ~(WHERE_ROWI
1e6f0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
1e700 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54  _RANGE);.    eqT
1e710 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54  ermMask = idxEqT
1e720 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20  ermMask;.  }..  
1e730 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
1e740 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
1e750 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  e and the SQLITE
1e760 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c  _ReverseOrder fl
1e770 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20  ag.  ** is set, 
1e780 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65  then reverse the
1e790 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20   order that the 
1e7a0 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63  index will be sc
1e7b0 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54  anned.  ** in. T
1e7c0 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
1e7d0 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74  application test
1e7e0 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e  ing, to help fin
1e7f0 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65  d cases.  ** whe
1e800 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62  re application b
1e810 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73  ehaviour depends
1e820 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e   on the (undefin
1e830 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20  ed) order that. 
1e840 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75   ** SQLite outpu
1e850 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68  ts rows in in th
1e860 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20  e absence of an 
1e870 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1e880 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64    */.  if( !pOrd
1e890 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e  erBy && pParse->
1e8a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1e8b0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1e8c0 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
1e8d0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1e8e0 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d  ERE_REVERSE;.  }
1e8f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
1e900 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e  erBy || (pCost->
1e910 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
1e920 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29  RE_ORDERBY)==0 )
1e930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 73  ;.  assert( pCos
1e940 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
1e950 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61  0 || (pCost->pla
1e960 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
1e970 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a  ROWID_EQ)==0 );.
1e980 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
1e990 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
1e9a0 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e    || pCost->plan
1e9b0 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20  .u.pIdx==0 .    
1e9c0 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61     || pCost->pla
1e9d0 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e  n.u.pIdx==pSrc->
1e9e0 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20  pIndex .  );..  
1e9f0 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
1ea00 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e  t index is: %s\n
1ea10 22 2c 20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d  ", .    ((pCost-
1ea20 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1ea30 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
1ea40 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20  AN)==0 ? "none" 
1ea50 3a 20 0a 20 20 20 20 20 20 20 20 20 70 43 6f 73  : .         pCos
1ea60 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f  t->plan.u.pIdx ?
1ea70 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1ea80 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1ea90 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62  k").  ));.  .  b
1eaa0 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
1eab0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1eac0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
1ead0 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
1eae0 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62 65 73 74  , pCost);.  best
1eaf0 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
1eb00 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1eb10 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f 73  , notReady, pCos
1eb20 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61  t);.  pCost->pla
1eb30 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54  n.wsFlags |= eqT
1eb40 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ermMask;.}../*.*
1eb50 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
1eb60 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1eb70 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e  ing table pSrc->
1eb80 70 54 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a  pTab. Write the.
1eb90 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c  ** best query pl
1eba0 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20  an and its cost 
1ebb0 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f  into the WhereCo
1ebc0 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69  st object suppli
1ebd0 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61  ed .** as the la
1ebe0 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  st parameter. Th
1ebf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
1ec00 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f  calculate the co
1ec10 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65  st of.** both re
1ec20 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74  al and virtual t
1ec30 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73  able scans..*/.s
1ec40 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
1ec50 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
1ec60 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1ec70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1ec80 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ec90 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1eca0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1ecb0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ecc0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1ecd0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
1ece0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1ecf0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1ed00 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
1ed10 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
1ed20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
1ed30 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1ed40 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  able for indexin
1ed50 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1ed60 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20  otValid,        
1ed70 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f     /* Cursors no
1ed80 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
1ed90 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20  any purpose */. 
1eda0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1edb0 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
1edc0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1edd0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  use */.  WhereCo
1ede0 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
1edf0 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
1ee00 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
1ee10 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
1ee20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ee30 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
1ee40 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
1ee50 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1ee60 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d  _index_info *p =
1ee70 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74   0;.    bestVirt
1ee80 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
1ee90 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
1eea0 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20  eady, notValid, 
1eeb0 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c  pOrderBy, pCost,
1eec0 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  &p);.    if( p->
1eed0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1eee0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1eef0 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72  3_free(p->idxStr
1ef00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ef10 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1ef20 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c  e->db, p);.  }el
1ef30 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1ef40 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
1ef50 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1ef60 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
1ef70 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
1ef80 2c 20 30 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d  , 0, pCost);.  }
1ef90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
1efa0 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
1efb0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
1efc0 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
1efd0 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
1efe0 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
1eff0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1f000 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
1f010 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
1f020 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
1f030 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
1f040 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
1f050 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
1f060 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
1f070 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
1f080 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
1f090 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f0a0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
1f0b0 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
1f0c0 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
1f0d0 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
1f0e0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f0f0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
1f100 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
1f110 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
1f120 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
1f130 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
1f140 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
1f150 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
1f160 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
1f170 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
1f180 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
1f190 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
1f1a0 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
1f1b0 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
1f1c0 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
1f1d0 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
1f1e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
1f1f0 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
1f200 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
1f210 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  ed..**.** IMPLEM
1f220 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
1f230 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65  4597-58655 No te
1f240 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72  sts are done for
1f250 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a   terms that are.
1f260 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61  ** completely sa
1f270 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63  tisfied by indic
1f280 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  es..**.** Disabl
1f290 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
1f2a0 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
1f2b0 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
1f2c0 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
1f2d0 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
1f2e0 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
1f2f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
1f300 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
1f310 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
1f320 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
1f330 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
1f340 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
1f350 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
1f360 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
1f370 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
1f380 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
1f390 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
1f3a0 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
1f3b0 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
1f3c0 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
1f3d0 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
1f3e0 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
1f3f0 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
1f400 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
1f410 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
1f420 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
1f430 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
1f440 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
1f450 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
1f460 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
1f470 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
1f480 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1f490 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
1f4a0 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
1f4b0 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
1f4c0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f4d0 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20  _CODED)==0.     
1f4e0 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65   && (pLevel->iLe
1f4f0 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  ftJoin==0 || Exp
1f500 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
1f510 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
1f520 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20  omJoin)).  ){.  
1f530 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
1f540 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
1f550 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
1f560 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20  Parent>=0 ){.   
1f570 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1f580 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70  ther = &pTerm->p
1f590 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61  WC->a[pTerm->iPa
1f5a0 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  rent];.      if(
1f5b0 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69   (--pOther->nChi
1f5c0 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ld)==0 ){.      
1f5d0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f5e0 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20  evel, pOther);. 
1f5f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
1f610 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  n OP_Affinity op
1f620 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68  code to apply th
1f630 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
1f640 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a  y string zAff.**
1f650 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74   to the n regist
1f660 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
1f670 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20  base. .**.** As 
1f680 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
1f690 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1f6a0 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20   entries (which 
1f6b0 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74  are no-ops) at t
1f6c0 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
1f6d0 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20  and end of zAff 
1f6e0 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  are ignored.  If
1f6f0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
1f700 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49  zAff are.** SQLI
1f710 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65  TE_AFF_NONE, the
1f720 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67  n no code gets g
1f730 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  enerated..**.** 
1f740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1f750 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  es its own copy 
1f760 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20  of zAff so that 
1f770 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72  the caller is fr
1f780 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  ee.** to modify 
1f790 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20  zAff after this 
1f7a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
1f7b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f7c0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
1f7d0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
1f7e0 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
1f7f0 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
1f800 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1f810 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
1f820 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  zAff==0 ){.    a
1f830 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1f840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1f860 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d   }.  assert( v!=
1f870 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73  0 );..  /* Adjus
1f880 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20  t base and n to 
1f890 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45  skip over SQLITE
1f8a0 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
1f8b0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
1f8c0 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20  ng.  ** and end 
1f8d0 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  of the affinity 
1f8e0 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77  string..  */.  w
1f8f0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66  hile( n>0 && zAf
1f900 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  f[0]==SQLITE_AFF
1f910 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
1f920 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20  ;.    base++;.  
1f930 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20    zAff++;.  }.  
1f940 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41  while( n>1 && zA
1f950 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f  ff[n-1]==SQLITE_
1f960 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1f970 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n--;.  }..  /* C
1f980 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e  ode the OP_Affin
1f990 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68  ity opcode if th
1f9a0 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ere is anything 
1f9b0 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  left to do. */. 
1f9c0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1f9d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f9e0 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  2(v, OP_Affinity
1f9f0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20  , base, n);.    
1fa00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1fa10 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c  eP4(v, -1, zAff,
1fa20 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
1fa30 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1fa40 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1fa50 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  base, n);.  }.}.
1fa60 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1fa70 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
1fa80 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  le equality term
1fa90 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1faa0 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69  ause.  An equali
1fab0 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62  ty.** term can b
1fac0 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20  e either X=expr 
1fad0 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20  or X IN (...).  
1fae0 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65   pTerm is the te
1faf0 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64  rm to be .** cod
1fb00 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  ed..**.** The cu
1fb10 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20  rrent value for 
1fb20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
1fb30 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
1fb40 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46  er iReg..**.** F
1fb50 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
1fb60 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
1fb70 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
1fb80 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
1fb90 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
1fba0 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
1fbb0 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
1fbc0 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
1fbd0 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
1fbe0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1fbf0 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
1fc00 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
1fc10 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
1fc20 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
1fc30 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74   int codeEqualit
1fc40 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  yTerm(.  Parse *
1fc50 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
1fc60 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1fc70 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
1fc80 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20  rm *pTerm,   /* 
1fc90 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  The term of the 
1fca0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
1fcb0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
1fcc0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1fcd0 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20  , /* When level 
1fce0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1fcf0 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
1fd00 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  g on */.  int iT
1fd10 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
1fd20 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76   Attempt to leav
1fd30 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69  e results in thi
1fd40 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1fd50 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
1fd60 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
1fd70 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1fd80 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65  pVdbe;.  int iRe
1fd90 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1fda0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1fdb0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20  holding results 
1fdc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54  */..  assert( iT
1fdd0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28  arget>0 );.  if(
1fde0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
1fdf0 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  {.    iReg = sql
1fe00 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1fe10 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  et(pParse, pX->p
1fe20 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1fe30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d  .  }else if( pX-
1fe40 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29  >op==TK_ISNULL )
1fe50 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
1fe60 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rget;.    sqlite
1fe70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fe80 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
1fe90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fea0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1feb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1fec0 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
1fed0 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
1fee0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20  InLoop *pIn;..  
1fef0 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
1ff00 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69  ==TK_IN );.    i
1ff10 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
1ff20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74     eType = sqlit
1ff30 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1ff40 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20  arse, pX, 0);.  
1ff50 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61    iTab = pX->iTa
1ff60 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
1ff70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ff80 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
1ff90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ffa0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1ffb0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
1ffc0 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  BLE );.    if( p
1ffd0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
1ffe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
1fff0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
20000 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20010 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
20020 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
20030 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
20040 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
20050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
20060 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
20070 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
20080 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
200b0 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
200c0 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
200d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
200e0 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
200f0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
20100 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
20110 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
20120 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
20130 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
20140 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
20150 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
20160 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
20170 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
20180 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
20190 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
201a0 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
201b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
201c0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
201d0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
201e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
201f0 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
20200 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
20210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20220 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
20230 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20  sNull, iReg);.  
20240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20250 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
20260 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
20270 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54  f.  }.  disableT
20280 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
20290 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  m);.  return iRe
202a0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
202b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
202c0 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c  ill evaluate all
202d0 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
202e0 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a  raints for an.**
202f0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f   index..**.** Fo
20300 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
20310 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
20320 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
20330 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
20340 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
20350 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
20360 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
20370 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
20380 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
20390 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
203a0 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
203b0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
203c0 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
203d0 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
203e0 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
203f0 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
20400 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
20410 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
20420 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
20430 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
20440 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
20450 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
20460 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
20470 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
20480 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
20490 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  b will be stored
204a0 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69  .** in consecuti
204b0 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ve registers and
204c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
204d0 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
204e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
204f0 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
20500 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
20510 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
20520 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
20530 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
20540 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
20550 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
20560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
20570 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
20580 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
20590 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
205a0 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
205b0 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  Mem memory cell 
205c0 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74  and.** compute t
205d0 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
205e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ng..**.** This r
205f0 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c  outine always al
20600 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73 74  locates at least
20610 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   one memory cell
20620 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
20630 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
20640 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54  t memory cell. T
20650 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
20660 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
20670 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
20680 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
20690 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e  store the termin
206a0 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c  ation.** key val
206b0 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
206c0 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
206d0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
206e0 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
206f0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
20700 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
20710 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
20720 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
20730 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
20740 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
20750 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
20760 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
20770 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
20780 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
20790 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
207a0 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
207b0 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
207c0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
207d0 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
207e0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
207f0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
20800 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
20810 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
20820 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
20830 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
20840 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
20850 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
20860 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
20870 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
20880 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
20890 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
208a0 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
208b0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
208c0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
208d0 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
208e0 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
208f0 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
20900 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
20910 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
20920 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
20930 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
20940 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
20950 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
20960 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20970 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
20980 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
20990 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
209a0 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
209b0 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
209c0 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
209d0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
209e0 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
209f0 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
20a00 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
20a10 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
20a20 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
20a30 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
20a40 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
20a50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
20a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
20a70 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
20a80 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
20a90 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
20aa0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20ab0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
20ac0 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
20ad0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
20ae0 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
20af0 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65   coding */.  Whe
20b00 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
20b10 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
20b20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d  clause */.  Bitm
20b30 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
20b40 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73    /* Which parts
20b50 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f   of FROM have no
20b60 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
20b70 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
20b80 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Reg,        /* N
20b90 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
20ba0 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
20bb0 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cate */.  char *
20bc0 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20 20  *pzAff          
20bd0 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70  /* OUT: Set to p
20be0 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79  oint to affinity
20bf0 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
20c00 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
20c10 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a  ->plan.nEq;   /*
20c20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
20c30 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
20c40 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
20c50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
20c60 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
20c70 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63  * The vm under c
20c80 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
20c90 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20cb0 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e  * The index bein
20cc0 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  g used for this 
20cd0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43  loop */.  int iC
20ce0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ur = pLevel->iTa
20cf0 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  bCur;   /* The c
20d00 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
20d10 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  le */.  WhereTer
20d20 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
20d30 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
20d40 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
20d50 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  m */.  int j;   
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20d80 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
20d90 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
20da0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
20db0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
20dc0 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20  t nReg;         
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20de0 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65  umber of registe
20df0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
20e00 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20  /.  char *zAff; 
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74    /* Affinity st
20e30 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a  ring to return *
20e40 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64  /..  /* This mod
20e50 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ule is only call
20e60 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e  ed on query plan
20e70 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e  s that use an in
20e80 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  dex. */.  assert
20e90 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
20ea0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
20eb0 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78  NDEXED );.  pIdx
20ec0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
20ed0 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69  u.pIdx;..  /* Fi
20ee0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
20ef0 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
20f00 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
20f10 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
20f20 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
20f30 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
20f40 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76  1;.  nReg = pLev
20f50 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e  el->plan.nEq + n
20f60 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72  ExtraReg;.  pPar
20f70 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
20f80 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69  ;..  zAff = sqli
20f90 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
20fa0 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49  se->db, sqlite3I
20fb0 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
20fc0 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28  v, pIdx));.  if(
20fd0 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50   !zAff ){.    pP
20fe0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
20ff0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
21000 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74  .  /* Evaluate t
21010 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
21020 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  traints.  */.  a
21030 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
21040 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66  lumn>=nEq );.  f
21050 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
21060 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b  ++){.    int r1;
21070 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
21080 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
21090 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
210a0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
210b0 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  k, notReady, pLe
210c0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
210d0 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66  s, pIdx);.    if
210e0 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30  ( NEVER(pTerm==0
210f0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f  ) ) break;.    /
21100 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
21110 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
21120 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
21130 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
21140 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
21150 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
21160 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
21170 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
21180 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
21190 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
211a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
211b0 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
211c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
211d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
211e0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
211f0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
21200 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  */.    r1 = code
21210 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
21220 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
21230 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  el, regBase+j);.
21240 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
21250 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69  ase+j ){.      i
21260 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
21270 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
21280 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
21290 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20  se, regBase);.  
212a0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
212b0 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r1;.      }else{
212c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
212d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
212e0 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42  _SCopy, r1, regB
212f0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a  ase+j);.      }.
21300 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
21310 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
21320 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
21330 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21340 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
21350 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
21360 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
21370 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53  perator & (WO_IS
21380 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20  NULL|WO_IN))==0 
21390 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
213a0 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70  Right = pTerm->p
213b0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
213c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
213d0 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
213e0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
213f0 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  +j, pLevel->addr
21400 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Brk);.      if( 
21410 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  zAff ){.        
21420 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
21430 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
21440 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c  t, zAff[j])==SQL
21450 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
21460 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
21470 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
21480 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
21490 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
214a0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
214b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
214c0 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a  ht, zAff[j]) ){.
214d0 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a            zAff[j
214e0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
214f0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
21500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21510 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66  .  *pzAff = zAff
21520 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  ;.  return regBa
21530 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  se;.}..#ifndef S
21540 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
21550 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  IN./*.** This ro
21560 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65  utine is a helpe
21570 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64  r for explainInd
21580 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a  exRange() below.
21590 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73  **.** pStr holds
215a0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
215b0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
215c0 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
215d0 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61  up one term.** a
215e0 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20  t a time.  This 
215f0 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e  routine adds a n
21600 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65  ew term to the e
21610 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  nd of the expres
21620 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61  sion..** Terms a
21630 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20  re separated by 
21640 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22  AND so add the "
21650 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65  AND" text for se
21660 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75  cond and subsequ
21670 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  ent.** terms onl
21680 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
21690 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54  d explainAppendT
216a0 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20  erm(.  StrAccum 
216b0 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pStr,          
216c0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
216d0 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
216e0 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  built */.  int i
216f0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
21700 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
21710 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46  of this term.  F
21720 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a  irst is zero */.
21730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
21740 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a  olumn,        /*
21750 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
21760 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
21770 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20  har *zOp        
21780 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21790 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  the operator */.
217a0 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29  ){.  if( iTerm )
217b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
217c0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41  Append(pStr, " A
217d0 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69  ND ", 5);.  sqli
217e0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
217f0 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c  d(pStr, zColumn,
21800 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53   -1);.  sqlite3S
21810 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
21820 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73  tr, zOp, 1);.  s
21830 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21840 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20  pend(pStr, "?", 
21850 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  1);.}../*.** Arg
21860 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73  ument pLevel des
21870 63 72 69 62 65 73 20 61 20 73 74 72 61 74 65 67  cribes a strateg
21880 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  y for scanning t
21890 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20  able pTab. This 
218a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
218b0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
218c0 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
218d0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64  r containing a d
218e0 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
218f0 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74   the subset of t
21900 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65  able rows scanne
21910 64 20 62 79 20 74 68 65 20 73 74 72 61 74 65 67  d by the strateg
21920 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66  y in the form of
21930 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65   an.** SQL expre
21940 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c  ssion. Or, if al
21950 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e  l rows are scann
21960 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
21970 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rned..**.** For 
21980 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
21990 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
219a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
219b0 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e  WHERE a=1 AND b>
219c0 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20  2;.**.** is run 
219d0 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e 20  and there is an 
219e0 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c  index on (a, b),
219f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
21a00 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a  ion returns a.**
21a10 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20   string similar 
21a20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f  to:.**.**   "a=?
21a30 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20   AND b>?".**.** 
21a40 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
21a50 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d  nter points to m
21a60 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
21a70 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
21a80 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
21a90 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
21aa0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
21ab0 20 74 6f 20 66 72 65 65 20 74 68 65 20 62 75 66   to free the buf
21ac0 66 65 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  fer when it is.*
21ad0 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * no longer requ
21ae0 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
21af0 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64  char *explainInd
21b00 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20  exRange(sqlite3 
21b10 2a 64 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20  *db, WhereLevel 
21b20 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a  *pLevel, Table *
21b30 70 54 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c  pTab){.  WherePl
21b40 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65  an *pPlan = &pLe
21b50 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64  vel->plan;.  Ind
21b60 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c  ex *pIndex = pPl
21b70 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e  an->u.pIdx;.  in
21b80 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e  t nEq = pPlan->n
21b90 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Eq;.  int i, j;.
21ba0 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d    Column *aCol =
21bb0 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69   pTab->aCol;.  i
21bc0 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70  nt *aiColumn = p
21bd0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b  Index->aiColumn;
21be0 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b  .  StrAccum txt;
21bf0 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
21c00 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67  & (pPlan->wsFlag
21c10 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
21c20 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
21c30 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20  IMIT))==0 ){.   
21c40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
21c50 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21c60 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c  Init(&txt, 0, 0,
21c70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
21c80 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20  TH);.  txt.db = 
21c90 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  db;.  sqlite3Str
21ca0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
21cb0 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f  , " (", 2);.  fo
21cc0 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b  r(i=0; i<nEq; i+
21cd0 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  +){.    explainA
21ce0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
21cf0 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e  i, aCol[aiColumn
21d00 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29  [i]].zName, "=")
21d10 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a  ;.  }..  j = i;.
21d20 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46    if( pPlan->wsF
21d30 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
21d40 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c  IMIT ){.    expl
21d50 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
21d60 78 74 2c 20 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69  xt, i++, aCol[ai
21d70 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
21d80 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  , ">");.  }.  if
21d90 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73  ( pPlan->wsFlags
21da0 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  &WHERE_TOP_LIMIT
21db0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41   ){.    explainA
21dc0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
21dd0 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e  i, aCol[aiColumn
21de0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29  [j]].zName, "<")
21df0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
21e00 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
21e10 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72  xt, ")", 1);.  r
21e20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
21e30 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74  AccumFinish(&txt
21e40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
21e50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
21e60 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
21e70 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
21e80 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
21e90 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
21ea0 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20  d. If the query 
21eb0 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69  being compiled i
21ec0 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  s an EXPLAIN QUE
21ed0 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c  RY PLAN, a singl
21ee0 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61  e.** record is a
21ef0 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  dded to the outp
21f00 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ut to describe t
21f10 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  he table scan st
21f20 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c  rategy in .** pL
21f30 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
21f40 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
21f50 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  can(.  Parse *pP
21f60 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
21f70 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
21f80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
21f90 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21fb0 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20  Table list this 
21fc0 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a  loop refers to *
21fd0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
21fe0 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  pLevel,         
21ff0 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77      /* Scan to w
22000 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  rite OP_Explain 
22010 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20  opcode for */.  
22020 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
22050 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  vel" column of o
22060 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  utput */.  int i
22070 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
22080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
22090 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63  lue for "from" c
220a0 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
220b0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
220c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
220d0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
220e0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
220f0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29  hereBegin() */.)
22100 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
22110 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
22120 20 20 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c    u32 flags = pL
22130 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22140 67 73 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  gs;.    struct S
22150 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
22160 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
22170 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
22180 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
22190 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
221a0 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
221b0 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
221c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
221d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
221e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
221f0 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
22200 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
22210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
22220 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
22230 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c  utput */.    sql
22240 69 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b  ite3_int64 nRow;
22250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
22260 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
22270 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
22280 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   scan */.    int
22290 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
222a0 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
222b0 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
222c0 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
222d0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
222e0 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
222f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
22300 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
22310 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
22320 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
22330 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
22340 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
22350 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
22360 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
22370 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 70     isSearch = (p
22380 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e  Level->plan.nEq>
22390 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
223a0 7c 7c 20 28 66 6c 61 67 73 26 28 57 48 45 52 45  || (flags&(WHERE
223b0 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
223c0 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
223e0 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
223f0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
22400 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
22410 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ));..    zMsg = 
22420 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
22430 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63  b, "%s", isSearc
22440 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e  h?"SEARCH":"SCAN
22450 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
22460 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
22470 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22480 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22490 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52  Msg, "%s SUBQUER
224a0 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65  Y %d", zMsg,pIte
224b0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
224c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
224d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
224e0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
224f0 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20   "%s TABLE %s", 
22500 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  zMsg, pItem->zNa
22510 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
22520 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
22530 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  s ){.      zMsg 
22540 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22550 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22560 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
22570 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22580 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
22590 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
225a0 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)!=0 ){.      
225b0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
225c0 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
225d0 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74  (db, pLevel, pIt
225e0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
225f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22600 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22610 2c 20 22 25 73 20 55 53 49 4e 47 20 25 73 25 73  , "%s USING %s%s
22620 49 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d  INDEX%s%s%s", zM
22630 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  sg, .          (
22640 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
22650 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f  EMP_INDEX)?"AUTO
22660 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20  MATIC ":""),.   
22670 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
22680 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
22690 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29  ?"COVERING ":"")
226a0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
226b0 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
226c0 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c  _INDEX)?"":" "),
226d0 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
226e0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
226f0 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65  INDEX)?"": pLeve
22700 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
22710 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
22720 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29    zWhere.      )
22730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
22740 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
22750 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
22760 20 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f   flags & (WHERE_
22770 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
22780 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
22790 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
227a0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
227b0 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
227c0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
227d0 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20  KEY", zMsg);..  
227e0 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 57 48      if( flags&WH
227f0 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
22800 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
22810 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22820 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
22830 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
22840 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22850 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
22860 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
22870 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
22880 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22890 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
228a0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
228b0 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
228c0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
228d0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
228e0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
228f0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22900 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22910 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22920 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
22930 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
22940 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  f( flags&WHERE_T
22950 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
22960 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22970 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22980 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
22990 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
229a0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
229b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
229c0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
229d0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
229e0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
229f0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
22a00 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
22a10 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20  nfo *pVtabIdx = 
22a20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
22a30 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a  VtabIdx;.      z
22a40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
22a50 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
22a60 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%s VIRTUAL TABL
22a70 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
22a80 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
22a90 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
22aa0 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49  ->idxNum, pVtabI
22ab0 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  dx->idxStr);.   
22ac0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
22ad0 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48  ( wctrlFlags&(WH
22ae0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
22af0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22b00 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  X) ){.      test
22b10 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
22b20 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
22b30 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52  _MIN );.      nR
22b40 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ow = 1;.    }els
22b50 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  e{.      nRow = 
22b60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
22b70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
22b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67  ;.    }.    zMsg
22b90 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
22ba0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
22bb0 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20   (~%lld rows)", 
22bc0 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20  zMsg, nRow);.   
22bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22be0 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
22bf0 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
22c00 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
22c10 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
22c20 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
22c30 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
22c40 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
22c50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22c60 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
22c70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22c80 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
22c90 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
22ca0 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
22cb0 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
22cc0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
22cd0 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
22ce0 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
22cf0 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
22d00 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
22d10 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
22d20 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
22d30 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
22d40 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
22d50 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
22d60 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
22d70 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
22d80 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
22d90 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  d */.  u16 wctrl
22da0 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f  Flags,      /* O
22db0 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
22dc0 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
22dd0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
22de0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
22df0 65 61 64 79 2c 20 20 20 20 2f 2a 20 57 68 69 63  eady,    /* Whic
22e00 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72  h tables are cur
22e10 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
22e20 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
22e30 72 65 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  re         /* Co
22e40 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
22e50 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  use */.){.  int 
22e60 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
22e70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22e80 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
22e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22ea0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
22eb0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
22ec0 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
22ed0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
22ee0 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
22ef0 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
22f00 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
22f10 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
22f20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
22f30 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
22f40 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
22f50 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
22f60 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
22f70 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
22f80 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
22f90 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
22fa0 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
22fb0 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
22fc0 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
22fd0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
22fe0 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
22ff0 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
23000 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
23010 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23030 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
23040 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
23050 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
23060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23070 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23080 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
230b0 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
230c0 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
230d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
230e0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
230f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23100 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
23110 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
23120 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
23130 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
23140 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
23150 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
23160 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
23190 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
231a0 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
231b0 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
231c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
231d0 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
231e0 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
231f0 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
23200 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
23210 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
23220 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
23230 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
23240 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
23250 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
23260 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
23270 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70  pVdbe;.  pWC = p
23280 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c  WInfo->pWC;.  pL
23290 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
232a0 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61  a[iLevel];.  pTa
232b0 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
232c0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
232d0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
232e0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
232f0 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
23300 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
23310 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23320 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f  REVERSE)!=0;.  o
23330 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76  mitTable = (pLev
23340 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
23350 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
23360 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
23370 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
23380 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
23390 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  ABLE)==0;..  /* 
233a0 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
233b0 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
233c0 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
233d0 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
233e0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
233f0 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
23400 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
23410 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
23420 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
23430 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
23440 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
23450 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
23460 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
23470 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
23480 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
23490 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
234a0 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
234b0 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
234c0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
234d0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
234e0 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
234f0 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
23500 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
23510 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
23520 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
23530 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
23540 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
23550 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
23560 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
23570 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
23580 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
23590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
235a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
235b0 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
235c0 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
235d0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
235e0 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
235f0 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
23600 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
23610 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
23620 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
23630 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
23640 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
23650 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
23660 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
23670 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
23680 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
23690 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
236a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
236b0 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
236c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
236d0 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
236e0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
236f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
23720 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
23730 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
23740 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23750 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
23760 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
23770 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ));.  }..#ifndef
23780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23790 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
237a0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
237b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
237c0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
237d0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30  ){.    /* Case 0
237e0 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
237f0 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
23800 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
23810 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
23820 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
23830 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
23840 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
23850 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
23860 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
23870 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
23880 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74  _index_info *pVt
23890 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  abIdx = pLevel->
238a0 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b  plan.u.pVtabIdx;
238b0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
238c0 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d  aint = pVtabIdx-
238d0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
238e0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
238f0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
23900 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20  t_usage *aUsage 
23910 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
23950 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
23960 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
23970 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
23980 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72  straint *aConstr
23990 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20  aint =.         
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
239d0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20  >aConstraint;.. 
239e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
239f0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23a00 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
23a10 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
23a20 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
23a30 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28  int+2);.    for(
23a40 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61  j=1; j<=nConstra
23a50 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
23a60 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e   for(k=0; k<nCon
23a70 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20  straint; k++){. 
23a80 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67         if( aUsag
23a90 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d  e[k].argvIndex==
23aa0 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  j ){.          i
23ab0 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
23ac0 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f  traint[k].iTermO
23ad0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
23ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23af0 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b  (pParse, pWC->a[
23b00 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52  iTerm].pExpr->pR
23b10 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b  ight, iReg+j+1);
23b20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
23b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23b40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
23b50 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62  =nConstraint ) b
23b60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23b80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
23b90 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75   pVtabIdx->idxNu
23ba0 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
23bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23bc0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
23bd0 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  -1, iReg+1);.   
23be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23bf0 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
23c00 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
23c10 20 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d   iReg, pVtabIdx-
23c20 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  >idxStr,.       
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23c40 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46  VtabIdx->needToF
23c50 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d  reeIdxStr ? P4_M
23c60 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
23c70 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64  IC);.    pVtabId
23c80 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
23c90 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  Str = 0;.    for
23ca0 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
23cb0 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
23cc0 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
23cd0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  mit ){.        i
23ce0 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
23cf0 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f  traint[j].iTermO
23d00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64  ffset;.        d
23d10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
23d20 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  l, &pWC->a[iTerm
23d30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
23d40 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
23d50 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
23d60 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
23d70 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
23d80 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
23d90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
23da0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
23db0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
23dc0 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
23dd0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
23de0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
23df0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
23e00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
23e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23e20 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
23e30 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
23e40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23e50 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
23e60 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63  /* Case 1:  We c
23e70 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
23e80 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
23e90 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
23ea0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
23eb0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
23ec0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
23ed0 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
23ee0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20   **          we 
23ef0 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70  reference multip
23f00 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20  le rows using a 
23f10 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22  "rowid IN (...)"
23f20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23f30 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20   construct..    
23f40 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  */.    iReleaseR
23f50 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
23f60 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
23f70 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
23f80 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
23f90 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
23fa0 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
23fb0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
23fc0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
23fd0 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
23fe0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
23ff0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
24000 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
24010 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
24020 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
24030 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
24040 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24050 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
24060 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24070 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
24080 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
24090 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
240a0 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65  pLevel, iRelease
240b0 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
240c0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
240d0 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
240e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
240f0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
24100 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
24110 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24120 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
24130 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
24140 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
24150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
24160 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
24170 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
24180 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
24190 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
241a0 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
241b0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
241c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
241d0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
241e0 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
241f0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20  RANGE ){.    /* 
24200 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
24210 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
24220 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
24230 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
24240 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
24250 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
24260 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
24270 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
24280 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
24290 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
242a0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
242b0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
242c0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72  ==0 );.    pStar
242d0 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
242e0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
242f0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
24300 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20  E, 0);.    pEnd 
24310 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
24320 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
24330 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
24340 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65   0);.    if( bRe
24350 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
24360 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
24370 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
24380 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
24390 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
243a0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
243b0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
243c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
243d0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
243e0 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
243f0 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
24400 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
24410 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
24420 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
24430 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
24440 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
24450 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
24460 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
24470 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
24480 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
24490 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
244a0 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
244b0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
244c0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
244d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
244e0 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
244f0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
24500 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
24510 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
24520 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
24530 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
24540 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
24550 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
24560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
24570 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
24580 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
24590 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
245a0 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
245b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
245c0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
245d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
245e0 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
245f0 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
24600 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
24610 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
24620 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
24630 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
24640 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
24650 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
24660 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
24670 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24680 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
24690 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
246a0 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
246b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
246c0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
246d0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
246e0 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
246f0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31  iCur );.      r1
24700 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24710 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24720 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
24730 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
24740 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
24750 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
24760 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
24770 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
24780 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24790 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
247a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
247b0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
247c0 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
247d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
247e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
247f0 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
24800 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
24810 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
24820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24840 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
24850 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
24860 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
24870 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
24880 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
24890 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
248a0 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
248b0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
248c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
248d0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
248e0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
248f0 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
24900 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24910 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
24920 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
24930 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  */.      memEndV
24940 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
24950 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
24960 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24970 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
24980 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
24990 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
249a0 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
249b0 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
249c0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
249d0 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
249e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
249f0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
24a00 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
24a10 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
24a20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
24a30 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
24a40 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
24a50 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24a60 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24a70 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
24a80 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
24a90 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
24aa0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
24ab0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
24ac0 74 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53  tart;.    if( pS
24ad0 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d  tart==0 && pEnd=
24ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
24af0 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
24b00 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
24b10 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
24b20 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24b30 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
24b40 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
24b50 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
24b60 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
24b70 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
24b80 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
24b90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
24ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
24bc0 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
24bd0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
24be0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
24bf0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
24c00 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
24c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24c20 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
24c30 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
24c40 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
24c50 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
24c60 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
24c70 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
24c80 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
24c90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24ca0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
24cb0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
24cc0 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
24cd0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  MN_RANGE|WHERE_C
24ce0 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20  OLUMN_EQ) ){.   
24cf0 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63   /* Case 3: A sc
24d00 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  an using an inde
24d10 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
24d20 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
24d30 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
24d40 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
24d50 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
24d60 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d   **         term
24d70 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  s ("==" or "IN" 
24d80 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20  operators) that 
24d90 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20  refer to the N. 
24da0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
24db0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
24dc0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74  of the index. It
24dd0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
24de0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
24df0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
24e00 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e  traints (>, <, >
24e10 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20  = or <=) on the 
24e20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20  indexed.    **  
24e30 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68         column th
24e40 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
24e50 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75  ollows the N equ
24e60 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20  alities. Only . 
24e70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
24e80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
24e90 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
24ea0 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
24eb0 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  est must.    ** 
24ec0 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
24ed0 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
24ee0 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61  erators. For exa
24ef0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
24f00 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64    **         ind
24f10 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29  ex is on (x,y,z)
24f20 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
24f30 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65  wing clauses are
24f40 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20   all .    **    
24f50 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
24f60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
24f70 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20           x=5.   
24f80 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
24f90 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20  =5 AND y=10.    
24fa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
24fb0 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
24fc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
24fd0 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
24fe0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
24ff0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20      x=5 AND y=5 
25000 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a  AND z<=10.    **
25010 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25020 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
25030 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
25040 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
25050 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  nly.    **      
25060 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a     the x=5 term:
25070 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
25080 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
25090 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20  D z<10.    **.  
250a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
250b0 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
250c0 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
250d0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
250e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49      **         I
250f0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
25100 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
25110 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73  aints, then N is
25120 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   at.    **      
25130 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20     least one..  
25140 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
25150 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
25160 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
25170 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
25180 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  RE clause.    **
25190 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
251a0 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
251b0 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
251c0 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
251d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
251e0 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
251f0 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
25200 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
25210 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20  Y..    */  .    
25220 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
25230 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
25240 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
25250 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
25260 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
25270 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
25280 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
25290 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
252a0 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
252b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
252c0 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
252d0 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
252e0 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
252f0 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
25300 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
25310 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
25320 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
25330 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
25340 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
25350 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
25360 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
25370 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
25380 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
25390 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
253a0 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
253b0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
253c0 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
253d0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
253e0 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
253f0 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
25400 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
25410 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
25420 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
25430 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
25440 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  aEndOp[] = {.   
25450 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20     OP_Noop,     
25460 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21          /* 0: (!
25470 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29  end_constraints)
25480 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
25490 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
254a0 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
254b0 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
254c0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
254d0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T             /*
254e0 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
254f0 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f  ints && bRev) */
25500 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
25510 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
25520 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  an.nEq;  /* Numb
25530 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
25540 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
25550 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
25560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25570 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
25580 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
25590 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ).. */.    int r
255a0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
255b0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
255c0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
255d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
255e0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31  es */.    int r1
255f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25600 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
25610 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57  egister */.    W
25620 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
25630 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
25640 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
25650 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
25660 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
25670 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
25680 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
25690 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
256a0 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
256b0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
256c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
256d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
256e0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
256f0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
25700 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25720 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
25730 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
25740 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
25750 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
25760 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
25770 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
25780 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
25790 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
257a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
257b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
257c0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
257d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
25800 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
25810 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
25820 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
25830 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
25840 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
25850 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
25860 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
25870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25880 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
25890 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
258a0 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
258d0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
258e0 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
258f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
25900 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
25910 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
25920 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
25930 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20  *zEndAff;       
25940 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
25950 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
25960 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
25970 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
25980 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
25990 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
259a0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
259b0 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d  r;.    k = pIdx-
259c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20  >aiColumn[nEq]; 
259d0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
259e0 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
259f0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
25a00 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
25a10 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
25a20 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
25a30 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
25a40 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
25a50 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
25a60 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
25a70 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
25a80 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
25a90 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
25aa0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
25ab0 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
25ac0 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
25ad0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
25ae0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
25af0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
25b00 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
25b10 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
25b20 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
25b30 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
25b40 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
25b50 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
25b60 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
25b70 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
25b80 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
25b90 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
25ba0 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
25bb0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
25bc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25bd0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
25be0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
25bf0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76  =0.     && (pLev
25c00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25c10 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a  &WHERE_ORDERBY).
25c20 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
25c30 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
25c40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
25c50 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
25c60 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
25c70 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
25c80 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
25c90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
25ca0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
25cb0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
25cc0 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
25cd0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
25ce0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25cf0 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
25d00 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
25d10 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
25d20 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
25d30 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
25d40 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
25d50 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
25d60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
25d70 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
25d80 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e   pRangeEnd = fin
25d90 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
25da0 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
25db0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64  O_LT|WO_LE), pId
25dc0 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
25dd0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
25de0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
25df0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
25e00 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
25e10 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
25e20 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rt = findTerm(pW
25e30 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
25e40 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f  eady, (WO_GT|WO_
25e50 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  GE), pIdx);.    
25e60 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
25e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
25e80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
25e90 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
25ea0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
25eb0 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
25ec0 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
25ed0 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
25ee0 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
25ef0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
25f00 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
25f10 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
25f20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
25f30 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
25f40 79 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20  yTerms(.        
25f50 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
25f60 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  pWC, notReady, n
25f70 45 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72  ExtraReg, &zStar
25f80 74 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  tAff.    );.    
25f90 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65  zEndAff = sqlite
25fa0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
25fb0 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
25fc0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
25fd0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
25fe0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
25ff0 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
26000 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
26010 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
26020 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
26030 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
26040 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
26050 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
26060 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
26070 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
26080 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
26090 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
260a0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
260b0 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  f( nEq<pIdx->nCo
260c0 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
260d0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
260e0 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
260f0 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20 53 57  ASC) ){.      SW
26100 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
26110 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
26120 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a  eStart);.    }..
26130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
26140 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
26150 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
26160 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
26170 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26180 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
26190 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
261a0 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
261b0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
261c0 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
261d0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
261e0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
261f0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
26200 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
26210 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
26220 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20   );.    startEq 
26230 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
26240 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
26250 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
26260 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e  E|WO_GE);.    en
26270 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45  dEq =   !pRangeE
26280 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d  nd || pRangeEnd-
26290 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
262a0 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
262b0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
262c0 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20  s = pRangeStart 
262d0 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f  || nEq>0;..    /
262e0 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78  * Seek the index
262f0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
26300 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  tart of the rang
26310 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74  e. */.    nConst
26320 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
26330 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
26340 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
26350 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53  pRight = pRangeS
26360 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  tart->pExpr->pRi
26370 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
26380 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
26390 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
263a0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
263b0 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  f( (pRangeStart-
263c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
263d0 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
263e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
263f0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
26400 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
26410 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
26420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26430 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
26440 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26450 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
26460 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
26470 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
26480 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
26490 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
264a0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
264b0 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
264c0 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
264d0 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
264e0 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
264f0 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
26500 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
26510 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
26520 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
26530 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
26540 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
26550 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
26560 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
26570 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
26580 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26590 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
265a0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
265b0 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
265c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
265d0 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
265e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
265f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26600 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
26610 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
26620 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
26630 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
26640 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
26650 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
26660 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c  11662 */.    }el
26670 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
26680 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
26690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
266a0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
266b0 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
266c0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
266d0 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
266e0 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
266f0 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
26700 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
26710 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
26720 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
26730 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
26740 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
26750 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
26760 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
26770 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
26780 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
26790 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
267a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
267b0 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
267c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
267d0 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
267e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
267f0 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
26800 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
26810 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
26820 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
26830 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
26840 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
26850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26860 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
26870 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
26880 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
26890 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
268a0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
268b0 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
268c0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
268d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
268e0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
268f0 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
26900 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
26910 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
26920 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
26930 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
26940 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
26950 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
26960 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26970 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
26980 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
26990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
269a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
269b0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
269c0 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
269d0 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
269e0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
269f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26a00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
26a10 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
26a20 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
26a30 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
26a40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
26a50 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ndAff ){.       
26a60 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
26a70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
26a80 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
26a90 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
26aa0 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
26ab0 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
26ac0 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
26ad0 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
26ae0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
26af0 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
26b00 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
26b10 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
26b20 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
26b30 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
26b40 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
26b50 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
26b60 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
26b70 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
26b80 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
26b90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
26ba0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
26bb0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
26bc0 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
26bd0 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
26be0 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
26bf0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
26c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26c10 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
26c20 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
26c30 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
26c40 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  Eq+1, zEndAff);.
26c50 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
26c60 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
26c70 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
26c80 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
26c90 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
26ca0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
26cb0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
26cc0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
26cd0 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
26ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
26cf0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
26d00 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f  zEndAff);..    /
26d10 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
26d20 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
26d30 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
26d40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
26d50 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
26d60 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
26d70 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
26d80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
26d90 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20  ange. */.    op 
26da0 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
26db0 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
26dc0 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74   + bRev)];.    t
26dd0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26de0 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74  Noop );.    test
26df0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
26e00 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
26e10 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
26e20 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   );.    if( op!=
26e30 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
26e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26e50 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
26e60 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
26e70 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
26e80 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
26e90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
26ea0 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f  v, endEq!=bRev ?
26eb0 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  1:0);.    }..   
26ec0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
26ed0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
26ee0 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74  traints, check t
26ef0 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20  hat the value.  
26f00 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
26f10 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  e column that th
26f20 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
26f30 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55  trains is not NU
26f40 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74  LL..    ** If it
26f50 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65   is, jump to the
26f60 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
26f70 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  of the loop..   
26f80 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
26f90 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
26fa0 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74  Parse);.    test
26fb0 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
26fc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
26fd0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a  RE_BTM_LIMIT );.
26fe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
26ff0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
27000 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
27010 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
27020 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
27030 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
27040 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
27050 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
27060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27070 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
27080 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
27090 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
270a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
270b0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
270c0 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
270d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
270e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
270f0 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
27100 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
27110 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
27120 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
27130 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
27140 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
27150 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
27160 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
27170 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
27180 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
27190 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
271a0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
271b0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
271c0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
271d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
271e0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
271f0 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
27200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27210 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
27220 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
27230 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
27240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27250 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
27260 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
27270 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
27280 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
27290 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
272a0 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
272b0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
272c0 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
272d0 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
272e0 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
272f0 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
27300 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
27310 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
27320 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27330 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  sFlags & WHERE_U
27340 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70  NIQUE ){.      p
27350 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
27360 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
27370 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
27380 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
27390 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
273a0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
273b0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
273c0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
273d0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
273e0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
273f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
27400 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
27410 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
27420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
27430 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
27440 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
27450 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
27460 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
27470 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
27480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
27490 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
274a0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
274b0 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
274c0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
274d0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
274e0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
274f0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
27500 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
27510 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
27520 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
27530 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
27540 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
27550 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
27560 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
27570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
27580 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
27590 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
275a0 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
275b0 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
275c0 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
275d0 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
275e0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
275f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
27600 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
27610 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
27620 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
27630 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
27640 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
27650 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
27660 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
27670 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
27680 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
27690 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
276a0 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
276b0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
276c0 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
276d0 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
276e0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
276f0 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
27700 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
27710 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
27720 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
27730 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
27740 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
27750 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
27760 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
27770 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27780 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
27790 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
277a0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
277b0 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
277c0 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
277d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
277e0 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
277f0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
27800 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
27810 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
27820 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
27830 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
27840 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
27850 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
27860 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
27870 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
27880 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
27890 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
278a0 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
278b0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
278c0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
278e0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
278f0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
27900 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
27910 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
27920 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
27930 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
27940 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27950 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
27980 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
27990 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
279a0 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
279b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
279c0 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
279d0 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
279e0 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
279f0 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
27a00 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
27a10 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
27a20 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
27a30 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
27a40 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
27a50 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
27a60 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
27a70 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
27a80 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
27a90 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
27aa0 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74  ..    int regRet
27ab0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
27ac0 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
27ad0 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64  /* Register used
27ae0 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a   with OP_Gosub *
27af0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
27b00 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
27b30 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f  RowSet object */
27b40 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
27b50 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b70 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
27b80 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ng rowid */.    
27b90 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20  int iLoopBody = 
27ba0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27bb0 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61  abel(v);  /* Sta
27bc0 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20  rt of loop body 
27bd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49  */.    int iRetI
27be0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
27c10 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f  egReturn init */
27c20 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65  .    int unteste
27c30 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20  dTerms = 0;     
27c40 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20          /* Some 
27c50 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  terms not comple
27c60 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20  tely tested */. 
27c70 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27ca0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 45 78 70  unter */.    Exp
27cb0 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b  r *pAndExpr = 0;
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e  /* An ".. AND (.
27ce0 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
27cf0 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d  */.   .    pTerm
27d00 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
27d10 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73  u.pTerm;.    ass
27d20 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
27d30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
27d40 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
27d50 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
27d60 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
27d70 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
27d80 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
27d90 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
27da0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
27db0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
27dc0 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
27dd0 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
27de0 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
27df0 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
27e00 20 6e 69 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   ni pOrTab conta
27e10 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
27e20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
27e30 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
27e40 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
27e50 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
27e60 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
27e70 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
27e80 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
27e90 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
27ea0 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
27eb0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
27ec0 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
27ed0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
27ee0 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
27ef0 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
27f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f10 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
27f20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
27f30 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
27f40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27f50 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
27f60 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
27f70 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
27f80 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
27f90 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
27fa0 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
27fb0 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
27fc0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70  3StackAllocRaw(p
27fd0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ff0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
28000 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64  OrTab)+ nNotRead
28010 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  y*sizeof(pOrTab-
28020 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69  >a[0]));.      i
28030 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72  f( pOrTab==0 ) r
28040 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
28050 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41        pOrTab->nA
28060 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f  lloc = (i16)(nNo
28070 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
28080 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
28090 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
280a0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
280b0 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
280c0 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
280d0 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
280e0 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
280f0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
28100 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
28110 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
28120 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
28130 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
28140 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
28150 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
28160 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
28170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28180 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
28190 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
281a0 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
281b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
281c0 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
281d0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
281e0 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
281f0 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
28200 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
28210 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
28220 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
28230 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
28240 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
28250 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
28260 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
28270 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
28280 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
28290 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
282a0 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
282b0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
282c0 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
282d0 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
282e0 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
282f0 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
28300 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
28310 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
28320 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
28330 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28340 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
28350 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
28360 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
28370 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
28380 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
28390 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
283a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
283b0 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
283c0 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
283d0 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
283e0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
283f0 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
28400 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
28410 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28420 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
28430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
28440 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
28450 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
28460 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
28470 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
28480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28490 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
284a0 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
284b0 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
284c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
284d0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
284e0 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
284f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28500 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
28510 63 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74  clause is z of t
28520 68 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52  he form:  (x1 OR
28530 20 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20   x2 OR ...) AND 
28540 79 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f  y.    ** Then fo
28550 72 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c  r every term xN,
28560 20 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65   evaluate as the
28570 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20   subexpression: 
28580 78 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20  xN AND z.    ** 
28590 54 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20  That way, terms 
285a0 69 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61  in y that are fa
285b0 63 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20  ctored into the 
285c0 64 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  disjunction will
285d0 0a 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65  .    ** be picke
285e0 64 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75  d up by the recu
285f0 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73  rsive calls to s
28600 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28610 28 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  () below..    */
28620 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
28630 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  erm>1 ){.      p
28640 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
28650 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
28660 65 2d 3e 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  e->db, TK_AND, 0
28670 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 41 6e 64  , 0);.      pAnd
28680 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 70  Expr->pRight = p
28690 57 68 65 72 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  Where;.    }..  
286a0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
286b0 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
286c0 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
286d0 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
286e0 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
286f0 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
28700 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
28710 72 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  r || pOrTerm->eO
28720 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
28730 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
28740 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b  Info *pSubWInfo;
28750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
28760 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d  o for single OR-
28770 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20  term scan */.   
28780 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78       Expr *pOrEx
28790 70 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  pr = pOrTerm->pE
287a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
287b0 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
287c0 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d         pAndExpr-
287d0 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78 70 72  >pLeft = pOrExpr
287e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 45  ;.          pOrE
287f0 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72 3b 0a  xpr = pAndExpr;.
28800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28810 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
28820 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
28830 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
28840 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
28850 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
28860 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
28870 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
28880 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
28890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
288a0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
288b0 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 20 7c  MIT_OPEN_CLOSE |
288c0 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c 59 20   WHERE_AND_ONLY 
288d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
288e0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
288f0 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48  FORCE_TABLE | WH
28900 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
28910 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Y);.        if( 
28920 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20  pSubWInfo ){.   
28930 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e         explainOn
28940 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20  eScan(.         
28950 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72       pParse, pOr
28960 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d  Tab, &pSubWInfo-
28970 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70  >a[0], iLevel, p
28980 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a  Level->iFrom, 0.
28990 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
289a0 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
289b0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
289c0 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30  UPLICATES_OK)==0
289d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
289e0 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d  int iSet = ((ii=
289f0 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29  =pOrWc->nTerm-1)
28a00 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20  ?-1:ii);.       
28a10 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20       int r;.    
28a20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69          r = sqli
28a30 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
28a40 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
28a50 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c  bItem->pTab, -1,
28a60 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20   iCur, .        
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
28aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28ab0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
28ac0 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72  OP_RowSetTest, r
28ad0 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20  egRowset,.      
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28b00 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
28b10 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29  r(v)+2, r, iSet)
28b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28b40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28b50 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
28b60 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
28b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28b80 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
28b90 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
28ba0 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
28bb0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
28bc0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
28bd0 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
28be0 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
28bf0 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
28c00 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
28c10 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
28c20 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
28c30 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
28c40 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
28c50 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
28c60 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
28c70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28c80 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
28c90 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
28ca0 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
28cb0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
28cc0 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f  /* Finish the lo
28cd0 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
28ce0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
28cf0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
28d00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
28d10 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
28d20 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  SubWInfo);.     
28d30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28d40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
28d50 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
28d60 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20   pAndExpr);.    
28d70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
28d80 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
28d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
28da0 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
28db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28dc0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
28dd0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
28de0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
28df0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28e00 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
28e10 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
28e20 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
28e30 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
28e40 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
28e50 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
28e60 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
28e70 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
28e80 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
28e90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
28ea0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
28eb0 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
28ec0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
28ed0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
28ee0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
28ef0 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
28f00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
28f10 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
28f20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
28f30 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28f40 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
28f50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
28f60 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
28f70 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
28f80 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
28f90 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
28fa0 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
28fb0 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
28fc0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
28fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
28fe0 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
28ff0 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
29000 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
29010 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
29020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29030 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
29040 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
29050 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
29060 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
29070 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
29080 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
29090 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
290a0 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
290b0 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
290c0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
290d0 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
290e0 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
290f0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
29100 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
29110 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
29120 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
29130 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
29140 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
29150 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
29160 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
29170 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
29180 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
29190 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
291a0 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
291b0 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
291c0 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
291d0 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
291e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
291f0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
29200 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
29210 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
29220 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
29230 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29240 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
29250 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
29260 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
29270 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
29280 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
29290 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
292a0 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
292b0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
292c0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
292d0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
292e0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
292f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
29300 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
29310 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
29320 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
29330 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
29340 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
29350 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29360 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
29370 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
29380 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
29390 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
293a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
293b0 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
293c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
293d0 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
293e0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
293f0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
29400 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
29410 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
29420 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
29430 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
29440 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29450 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
29460 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
29470 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
29480 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
29490 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
294a0 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
294b0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
294c0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
294d0 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
294e0 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
294f0 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
29500 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
29510 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
29520 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
29530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
29540 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
29550 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
29560 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
29570 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29580 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
29590 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
295a0 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
295b0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
295c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
295d0 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
295e0 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
295f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29600 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
29610 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
29620 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
29630 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
29640 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
29650 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
29660 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
29670 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
29680 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
29690 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
296a0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
296b0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
296c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
296d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
296e0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
296f0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
29700 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
29710 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
29720 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
29730 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29740 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
29750 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
29760 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
29770 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
29780 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
29790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
297a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
297b0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
297c0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
297d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
297e0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
297f0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
29800 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
29810 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
29820 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
29830 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
29840 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
29850 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
29860 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
29870 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
29880 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
29890 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
298a0 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
298b0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
298c0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
298d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
298e0 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
298f0 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
29900 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
29910 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
29920 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
29930 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
29940 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
29950 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
29960 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
29970 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
29980 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
29990 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
299a0 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
299b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
299c0 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
299d0 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
299e0 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
299f0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
29a00 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
29a10 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
29a20 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
29a30 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
29a40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
29a50 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
29a60 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
29a70 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74  Info) ){.    int
29a80 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
29a90 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
29aa0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
29ab0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
29ac0 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
29ad0 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
29ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
29af0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
29b00 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
29b10 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
29b20 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
29b30 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20  Failed ); */.   
29b40 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
29b50 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
29b60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
29b70 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
29b80 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
29b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
29ba0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
29bb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
29bc0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
29bd0 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[i].plan.wsFla
29be0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
29bf0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
29c00 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
29c10 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
29c20 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
29c30 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
29c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
29c50 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a  Free(db, pIdx->z
29c60 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20  ColAff);.       
29c70 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
29c80 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
29c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29ca0 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61    }.    whereCla
29cb0 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d  useClear(pWInfo-
29cc0 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pWC);.    sqlit
29cd0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
29ce0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
29cf0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
29d00 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
29d10 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
29d20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
29d30 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
29d40 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
29d50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
29d60 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
29d70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
29d80 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
29d90 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
29da0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
29db0 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
29dc0 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
29dd0 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
29de0 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
29df0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
29e00 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
29e10 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
29e20 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
29e30 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
29e40 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
29e50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
29e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29e70 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
29e80 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
29e90 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
29ea0 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
29eb0 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
29ec0 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
29ed0 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
29ee0 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
29ef0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
29f00 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
29f10 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
29f20 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
29f30 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
29f40 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
29f50 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
29f60 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
29f70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
29f80 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
29f90 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
29fa0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
29fb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
29fc0 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
29fd0 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
29fe0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
29ff0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2a000 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2a010 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2a020 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2a030 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2a040 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2a050 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2a060 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2a070 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2a080 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2a090 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2a0a0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2a0b0 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2a0c0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2a0d0 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0f0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2a100 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2a110 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2a140 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2a150 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2a160 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2a170 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2a180 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2a190 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2a1a0 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2a1b0 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2a1c0 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2a1d0 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2a1e0 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2a1f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2a200 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2a210 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2a220 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2a230 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2a240 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2a250 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2a260 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2a270 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2a280 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2a290 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2a2a0 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2a2b0 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2a2c0 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2a2d0 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2a2e0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2a2f0 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2a300 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2a310 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2a320 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2a330 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
2a340 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2a350 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
2a360 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
2a370 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
2a380 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
2a390 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
2a3a0 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
2a3b0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
2a3c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2a3d0 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
2a3e0 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
2a3f0 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
2a400 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
2a410 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
2a420 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
2a430 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
2a440 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
2a450 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
2a460 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
2a470 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
2a480 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
2a490 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
2a4a0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
2a4b0 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
2a4c0 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
2a4d0 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
2a4e0 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
2a4f0 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
2a500 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
2a510 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
2a520 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
2a530 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
2a540 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
2a550 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
2a560 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2a570 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2a580 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
2a590 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
2a5a0 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
2a5b0 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
2a5c0 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
2a5d0 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
2a5e0 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
2a5f0 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
2a600 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
2a610 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
2a620 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2a630 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
2a640 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2a650 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
2a660 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
2a670 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a680 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
2a690 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
2a6a0 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
2a6b0 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2a6c0 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2a6d0 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2a6e0 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2a6f0 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2a700 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a710 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2a720 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2a730 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2a740 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2a750 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2a760 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2a770 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2a780 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2a790 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2a7a0 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2a7b0 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2a7c0 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2a7d0 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2a7e0 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2a7f0 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2a800 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2a810 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2a820 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2a830 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2a840 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2a850 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2a860 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2a870 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2a880 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2a890 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2a8a0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2a8b0 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2a8c0 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2a8d0 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2a8e0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2a8f0 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2a900 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2a910 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2a920 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2a930 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2a940 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2a950 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2a960 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61   *ppOrderBy is a
2a970 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2a980 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2a990 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
2a9a0 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65  ement,.** if the
2a9b0 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
2a9c0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
2a9d0 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
2a9e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a9f0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
2aa00 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
2aa10 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
2aa20 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73  hen ppOrderBy is
2aa30 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2aa40 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  an index can be 
2aa50 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  used so that the
2aa60 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20   natural output 
2aa70 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62  order of the tab
2aa80 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f  le.** scan is co
2aa90 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52  rrect for the OR
2aaa0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2aab0 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69  hen that index i
2aac0 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70  s used and.** *p
2aad0 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20  pOrderBy is set 
2aae0 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69  to NULL.  This i
2aaf0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2ab00 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  n that prevents 
2ab10 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72  an.** unnecessar
2ab20 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65  y sort of the re
2ab30 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69  sult set if an i
2ab40 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65  ndex appropriate
2ab50 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45   for the.** ORDE
2ab60 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65  R BY clause alre
2ab70 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ady exists..**.*
2ab80 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63  * If the where c
2ab90 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e  lause loops cann
2aba0 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74  ot be arranged t
2abb0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f  o provide the co
2abc0 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20  rrect.** output 
2abd0 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
2abe0 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e  *ppOrderBy is un
2abf0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72  changed..*/.Wher
2ac00 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
2ac10 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
2ac20 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2ac30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2ac40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
2ac50 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2ac60 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
2ac70 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
2ac80 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
2ac90 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
2aca0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2acb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2acc0 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42  rList **ppOrderB
2acd0 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42  y, /* An ORDER B
2ace0 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
2acf0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2ad00 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20  *pDistinct,  /* 
2ad10 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  The select-list 
2ad20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65  for DISTINCT que
2ad30 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a  ries - or NULL *
2ad40 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2ad50 67 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs        /* One
2ad60 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
2ad70 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
2ad80 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
2ad90 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adb0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2adc0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  */.  int nByteWI
2add0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
2ade0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
2adf0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
2ae00 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
2ae10 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae30 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
2ae40 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
2ae50 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2ae60 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
2ae70 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
2ae80 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2ae90 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2aea0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
2aeb0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
2aec0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
2aed0 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
2aee0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
2aef0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
2af00 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
2af10 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
2af20 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
2af30 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2af40 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
2af50 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
2af60 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2af70 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2af80 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
2af90 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48  sition of the WH
2afa0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2afb0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2afc0 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
2afd0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72  /* A single entr
2afe0 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20  y from pTabList 
2aff0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
2b000 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
2b010 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2b020 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57   level in the pW
2b030 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69  Info list */.  i
2b040 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20  nt iFrom;       
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b060 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46  * First unused F
2b070 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
2b080 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46  nt */.  int andF
2b090 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2b0a0 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d     /* AND-ed com
2b0b0 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  bination of all 
2b0c0 70 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73  pWC->a[].wtFlags
2b0d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2b0e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2b0f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2b100 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  nection */..  /*
2b110 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
2b120 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2b130 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2b140 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2b150 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
2b160 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
2b170 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
2b180 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
2b190 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
2b1a0 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
2b1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2b1c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
2b1d0 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
2b1e0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
2b1f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2b200 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
2b210 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
2b220 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
2b230 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
2b240 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
2b250 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
2b260 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
2b270 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
2b280 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
2b290 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
2b2a0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
2b2b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
2b2c0 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
2b2d0 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
2b2e0 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
2b2f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b300 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
2b310 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
2b320 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
2b330 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
2b340 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
2b350 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
2b360 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
2b370 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2b380 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
2b390 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
2b3a0 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
2b3b0 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
2b3c0 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
2b3d0 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2b3e0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
2b3f0 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
2b400 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
2b410 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
2b420 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
2b430 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2b440 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
2b450 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
2b460 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
2b470 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
2b480 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
2b490 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
2b4a0 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
2b4b0 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
2b4c0 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
2b4d0 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
2b4e0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
2b4f0 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
2b500 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
2b510 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2b520 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  ;.  nByteWInfo =
2b530 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2b540 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2b550 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2b560 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2b570 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2b580 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
2b590 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f        nByteWInfo
2b5a0 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   + .      sizeof
2b5b0 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a  (WhereClause) +.
2b5c0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
2b5d0 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a  reMaskSet).  );.
2b5e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b5f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
2b600 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2b610 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
2b620 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
2b630 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2b640 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
2b650 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
2b660 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
2b670 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2b680 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2b690 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2b6a0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
2b6b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2b6c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
2b6d0 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20  fo->pWC = pWC = 
2b6e0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26  (WhereClause *)&
2b6f0 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e  ((u8 *)pWInfo)[n
2b700 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57  ByteWInfo];.  pW
2b710 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b720 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
2b730 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2b740 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
2b750 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
2b760 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65   pMaskSet = (Whe
2b770 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b  reMaskSet*)&pWC[
2b780 31 5d 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  1];..  /* Disabl
2b790 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
2b7a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
2b7b0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2b7c0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
2b7d0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2b7e0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
2b7f0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
2b800 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
2b810 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2b820 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 29  TE_DistinctOpt )
2b830 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a   pDistinct = 0;.
2b840 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
2b850 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
2b860 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
2b870 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
2b880 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
2b890 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
2b8a0 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
2b8b0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
2b8c0 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
2b8d0 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
2b8e0 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50  auseInit(pWC, pP
2b8f0 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20  arse, pMaskSet, 
2b900 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 73  wctrlFlags);.  s
2b910 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2b920 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2b930 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2b940 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72  Split(pWC, pWher
2b950 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a  e, TK_AND);   /*
2b960 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33   IMP: R-15842-53
2b970 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  296 */.    .  /*
2b980 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
2b990 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2b9a0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
2b9b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
2b9c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2b9d0 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
2b9e0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
2b9f0 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
2ba00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
2ba10 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
2ba20 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
2ba30 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
2ba40 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
2ba50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2ba60 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
2ba70 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
2ba80 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
2ba90 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
2baa0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
2bab0 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
2bac0 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
2bad0 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
2bae0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2baf0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
2bb00 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
2bb10 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
2bb20 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
2bb30 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
2bb40 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
2bb50 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
2bb60 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
2bb70 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
2bb80 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
2bb90 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
2bba0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
2bbb0 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
2bbc0 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
2bbd0 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
2bbe0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
2bbf0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
2bc00 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
2bc10 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
2bc20 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
2bc30 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
2bc40 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
2bc50 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
2bc60 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
2bc70 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
2bc80 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
2bc90 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
2bca0 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
2bcb0 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
2bcc0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2bcd0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
2bce0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
2bcf0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
2bd00 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2bd10 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
2bd20 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
2bd30 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
2bd40 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  5..  **.  ** Con
2bd50 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65  figure the Where
2bd60 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72  Clause.vmask var
2bd70 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69  iable so that bi
2bd80 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ts that correspo
2bd90 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75  nd.  ** to virtu
2bda0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
2bdb0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69   are set. This i
2bdc0 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74  s used to select
2bdd0 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20  ively disable . 
2bde0 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e   ** the OR-to-IN
2bdf0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2be00 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  in exprAnalyzeOr
2be10 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f  Term(). It is no
2be20 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20  t helpful .  ** 
2be30 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
2be40 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  les..  **.  ** N
2be50 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
2be60 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2be70 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
2be80 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
2be90 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
2bea0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
2beb0 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
2bec0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
2bed0 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
2bee0 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
2bef0 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
2bf00 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
2bf10 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
2bf20 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2bf30 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
2bf40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43  */.  assert( pWC
2bf50 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d  ->vmask==0 && pM
2bf60 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a  askSet->n==0 );.
2bf70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2bf80 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2bf90 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
2bfa0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2bfb0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
2bfc0 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  or);.#ifndef SQL
2bfd0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2bfe0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c  TABLE.    if( AL
2bff0 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61  WAYS(pTabList->a
2c000 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56  [i].pTab) && IsV
2c010 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d  irtual(pTabList-
2c020 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[i].pTab) ){. 
2c030 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20       pWC->vmask 
2c040 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c  |= ((Bitmask)1 <
2c050 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  < i);.    }.#end
2c060 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  if.  }.#ifndef N
2c070 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
2c080 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
2c090 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
2c0a0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2c0b0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2c0c0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
2c0d0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2c0e0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2c0f0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rsor);.      ass
2c100 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68  ert( (m-1)==toTh
2c110 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74  eLeft );.      t
2c120 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20  oTheLeft |= m;. 
2c130 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c140 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
2c150 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
2c160 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
2c170 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
2c180 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
2c190 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
2c1a0 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
2c1b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2c1c0 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
2c1d0 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
2c1e0 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
2c1f0 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
2c200 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
2c210 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
2c220 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
2c230 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
2c240 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
2c250 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
2c260 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e  d..  */.  exprAn
2c270 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73  alyzeAll(pTabLis
2c280 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64  t, pWC);.  if( d
2c290 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c2a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
2c2b0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2c2c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
2c2d0 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
2c2e0 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65  lifier, if there
2c2f0 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75   is one, is redu
2c300 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20  ndant. .  ** If 
2c310 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20  it is, then set 
2c320 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c  pDistinct to NUL
2c330 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e  L and WhereInfo.
2c340 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a  eDistinct to.  *
2c350 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  * WHERE_DISTINCT
2c360 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20  _UNIQUE to tell 
2c370 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67  the caller to ig
2c380 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43  nore the DISTINC
2c390 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  T..  */.  if( pD
2c3a0 69 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73  istinct && isDis
2c3b0 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
2c3c0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2c3d0 20 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29   pWC, pDistinct)
2c3e0 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63   ){.    pDistinc
2c3f0 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66  t = 0;.    pWInf
2c400 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2c410 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2c420 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  IQUE;.  }..  /* 
2c430 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
2c440 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
2c450 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
2c460 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
2c470 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
2c480 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
2c490 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
2c4a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
2c4b0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
2c4c0 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
2c4d0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
2c4e0 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
2c4f0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2c500 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48  a[].wsFlags   WH
2c510 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
2c520 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
2c530 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
2c540 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
2c550 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
2c560 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
2c570 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
2c580 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
2c590 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74   Which term of t
2c5a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2c5b0 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
2c5c0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2c5d0 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
2c5e0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
2c5f0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
2c600 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
2c610 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
2c620 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2c630 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
2c640 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2c650 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77  pTerm     When w
2c660 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74  sFlags==WO_OR, t
2c670 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72  he OR-clause ter
2c680 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  m.  **.  ** This
2c690 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72   loop also figur
2c6a0 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69  es out the nesti
2c6b0 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  ng order of tabl
2c6c0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
2c6d0 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
2c6e0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2c6f0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64  Bitmask)0;.  and
2c700 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48  Flags = ~0;.  WH
2c710 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2c720 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
2c730 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69  **\n"));.  for(i
2c740 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c  =iFrom=0, pLevel
2c750 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
2c760 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
2c770 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
2c780 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
2c790 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
2c7a0 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
2c7b0 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
2c7c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c7e0 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
2c7f0 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
2c800 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2c830 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
2c840 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
2c850 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20  bestJ = -1;     
2c860 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
2c870 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
2c880 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8a0 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
2c8b0 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
2c8c0 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61      int isOptima
2c8d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2c8e0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
2c8f0 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69  optimal/non-opti
2c900 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  mal search */.  
2c910 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61    int nUnconstra
2c920 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ined;         /*
2c930 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77   Number tables w
2c940 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42  ithout INDEXED B
2c950 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  Y */.    Bitmask
2c960 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20   notIndexed;    
2c970 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2c980 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e  tables that cann
2c990 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
2c9a0 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
2c9b0 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a  bestPlan, 0, siz
2c9c0 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a  eof(bestPlan));.
2c9d0 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f      bestPlan.rCo
2c9e0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
2c9f0 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52  DBL;.    WHERETR
2ca00 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20  ACE(("*** Begin 
2ca10 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20  search for loop 
2ca20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a  %d ***\n", i));.
2ca30 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
2ca40 6f 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69  ough the remaini
2ca50 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ng entries in th
2ca60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f  e FROM clause to
2ca70 20 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a   find the.    **
2ca80 20 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f   next nested loo
2ca90 70 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74  p. The loop test
2caa0 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
2cab0 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  e entries.    **
2cac0 20 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20   either once or 
2cad0 74 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20  twice. .    **. 
2cae0 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
2caf0 74 65 73 74 20 69 73 20 61 6c 77 61 79 73 20 70  test is always p
2cb00 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72  erformed if ther
2cb10 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
2cb20 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  e entries.    **
2cb30 20 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e   remaining and n
2cb40 65 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69  ever performed i
2cb50 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  f there is only 
2cb60 6f 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  one FROM clause 
2cb70 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20  entry.    ** to 
2cb80 63 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68  choose from.  Th
2cb90 65 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f  e first test loo
2cba0 6b 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d  ks for an "optim
2cbb0 61 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20  al" scan.  In.  
2cbc0 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78    ** this contex
2cbd0 74 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61  t an optimal sca
2cbe0 6e 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73  n is one that us
2cbf0 65 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61  es the same stra
2cc00 74 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20  tegy.    ** for 
2cc10 74 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63  the given FROM c
2cc20 6c 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77  lause entry as w
2cc30 6f 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64  ould be selected
2cc40 20 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20   if the entry.  
2cc50 20 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61    ** were used a
2cc60 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
2cc70 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e  nested loop.  In
2cc80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
2cc90 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
2cca0 63 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74  chosen such that
2ccb0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e   the cost of run
2ccc0 6e 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20  ning that table 
2ccd0 63 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65  cannot be reduce
2cce0 64 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74  d.    ** by wait
2ccf0 69 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61  ing for other ta
2cd00 62 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73  bles to run firs
2cd10 74 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61  t.  This "optima
2cd20 6c 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20  l" test works.  
2cd30 20 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73    ** by first as
2cd40 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
2cd50 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f  FROM clause is o
2cd60 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
2cd70 20 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20   and finding.   
2cd80 20 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c   ** its query pl
2cd90 61 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e  an, then checkin
2cda0 67 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  g to see if that
2cdb0 20 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73   query plan uses
2cdc0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65   any.    ** othe
2cdd0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  r FROM clause te
2cde0 72 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  rms that are not
2cdf0 52 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f  Ready.  If no no
2ce00 74 52 65 61 64 79 20 74 65 72 6d 73 20 61 72 65  tReady terms are
2ce10 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65  .    ** used the
2ce20 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20  n the "optimal" 
2ce30 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73  query plan works
2ce40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ce50 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57 68  Note that the Wh
2ce60 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72  ereCost.nRow par
2ce70 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
2ce80 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74  timal scan might
2ce90 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  .    ** not be a
2cea0 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f  s small as it wo
2ceb0 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74 61  uld be if the ta
2cec0 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20  ble really were 
2ced0 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20  the innermost.  
2cee0 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20    ** join.  The 
2cef0 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62  nRow value can b
2cf00 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48 45  e reduced by WHE
2cf10 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
2cf20 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61  aints.    ** tha
2cf30 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64  t do not use ind
2cf40 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73 20  ices.  But this 
2cf50 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f  nRow reduction o
2cf60 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
2cf70 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  he.    ** table 
2cf80 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e  really is the in
2cf90 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a  nermost join.  .
2cfa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2cfb0 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74  e second loop it
2cfc0 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  eration is only 
2cfd0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20  performed if no 
2cfe0 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20  optimal scan.   
2cff0 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 77   ** strategies w
2d000 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65  ere found by the
2d010 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2d020 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74  . This second it
2d030 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  eration.    ** i
2d040 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68  s used to search
2d050 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20   for the lowest 
2d060 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c  cost scan overal
2d070 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
2d080 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
2d090 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72  ns of SQLite per
2d0a0 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20  formed only the 
2d0b0 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
2d0c0 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65   -.    ** the ne
2d0d0 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  xt outermost loo
2d0e0 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68 61  p was always tha
2d0f0 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73  t with the lowes
2d100 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a  t overall.    **
2d110 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20   cost. However, 
2d120 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20  this meant that 
2d130 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c  SQLite could sel
2d140 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c  ect the wrong pl
2d150 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63  an.    ** for sc
2d160 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74 68  ripts such as th
2d170 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
2d180 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20   **   .    **   
2d190 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2d1a0 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20  a, b); .    **  
2d1b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
2d1c0 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20  (c, d);.    **  
2d1d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2d1e0 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72  2, t1 WHERE t2.r
2d1f0 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20  owid = t1.a;.   
2d200 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62   **.    ** The b
2d210 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20  est strategy is 
2d220 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2d230 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73  gh table t1 firs
2d240 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20  t. However it.  
2d250 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
2d260 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  ible to determin
2d270 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69  e this with a si
2d280 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f  mple greedy algo
2d290 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69  rithm..    ** Si
2d2a0 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  nce the cost of 
2d2b0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
2d2c0 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69  rough table t2 i
2d2d0 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20  s the same .    
2d2e0 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f  ** as the cost o
2d2f0 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  f a linear scan 
2d300 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
2d310 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  , a simple greed
2d320 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69  y .    ** algori
2d330 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  thm may choose t
2d340 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65  o use t2 for the
2d350 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69   outer loop, whi
2d360 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20  ch is a much.   
2d370 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70   ** costlier app
2d380 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  roach..    */.  
2d390 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64    nUnconstrained
2d3a0 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64   = 0;.    notInd
2d3b0 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f  exed = 0;.    fo
2d3c0 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72  r(isOptimal=(iFr
2d3d0 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20  om<nTabList-1); 
2d3e0 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20  isOptimal>=0 && 
2d3f0 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d  bestJ<0; isOptim
2d400 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74  al--){.      Bit
2d410 6d 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20  mask mask;      
2d420 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2d430 66 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74  f tables not yet
2d440 20 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20   ready */.      
2d450 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61  for(j=iFrom, pTa
2d460 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d  bItem=&pTabList-
2d470 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73  >a[j]; j<nTabLis
2d480 74 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  t; j++, pTabItem
2d490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2d4a0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
2d4b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2d4c0 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
2d4d0 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
2d4e0 2a 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  */.        Where
2d4f0 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20  Cost sCost;     
2d500 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74  /* Cost informat
2d510 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69  ion from best[Vi
2d520 72 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f  rtual]Index() */
2d530 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
2d540 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
2d550 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d560 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70   for index to op
2d570 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  timize */.      
2d580 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
2d590 74 3b 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e  t;     /* DISTIN
2d5a0 43 54 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e  CT clause for in
2d5b0 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  dex to optimize 
2d5c0 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f  */.  .        do
2d5d0 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70  NotReorder =  (p
2d5e0 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  TabItem->jointyp
2d5f0 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
2d600 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20  CROSS))!=0;.    
2d610 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d      if( j!=iFrom
2d620 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72   && doNotReorder
2d630 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2d640 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    m = getMask(pM
2d650 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d  askSet, pTabItem
2d660 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2d670 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74      if( (m & not
2d680 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
2d690 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
2d6a0 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
2d6b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2d6c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2d6d0 20 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f       mask = (isO
2d6e0 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74  ptimal ? m : not
2d6f0 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20  Ready);.        
2d700 70 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d  pOrderBy = ((i==
2d710 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
2d720 3f 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a  ?*ppOrderBy:0);.
2d730 20 20 20 20 20 20 20 20 70 44 69 73 74 20 3d 20          pDist = 
2d740 28 69 3d 3d 30 20 3f 20 70 44 69 73 74 69 6e 63  (i==0 ? pDistinc
2d750 74 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  t : 0);.        
2d760 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49  if( pTabItem->pI
2d770 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e  ndex==0 ) nUncon
2d780 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20  strained++;.  . 
2d790 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
2d7a0 45 28 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20 74  E(("=== trying t
2d7b0 61 62 6c 65 20 25 64 20 77 69 74 68 20 69 73 4f  able %d with isO
2d7c0 70 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22  ptimal=%d ===\n"
2d7d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d7e0 20 20 20 20 20 20 6a 2c 20 69 73 4f 70 74 69 6d        j, isOptim
2d7f0 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  al));.        as
2d800 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
2d810 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  pTab );.#ifndef 
2d820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2d830 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
2d840 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2d850 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  TabItem->pTab) )
2d860 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2d870 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
2d880 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  *pp = &pWInfo->a
2d890 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [j].pIdxInfo;.  
2d8a0 20 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74          bestVirt
2d8b0 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
2d8c0 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2d8d0 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  mask, notReady, 
2d8e0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 20 26 73 43 6f 73 74 2c 20 70 70 29       &sCost, pp)
2d910 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2d920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2d930 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  {.          best
2d940 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73  BtreeIndex(pPars
2d950 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d  e, pWC, pTabItem
2d960 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79  , mask, notReady
2d970 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
2d980 20 20 20 20 20 20 20 20 20 20 70 44 69 73 74 2c            pDist,
2d990 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20   &sCost);.      
2d9a0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2d9b0 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c  rt( isOptimal ||
2d9c0 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74   (sCost.used&not
2d9d0 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20  Ready)==0 );..  
2d9e0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49        /* If an I
2d9f0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2da00 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
2da10 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20  n the plan must 
2da20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  use that.       
2da30 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20   ** index if it 
2da40 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61  uses any index a
2da50 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20  t all */.       
2da60 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
2da70 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20  m->pIndex==0 .  
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77  || (sCost.plan.w
2daa0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2dab0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a  OT_FULLSCAN)==0.
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dad0 20 20 7c 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e    || sCost.plan.
2dae0 75 2e 70 49 64 78 3d 3d 70 54 61 62 49 74 65 6d  u.pIdx==pTabItem
2daf0 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20  ->pIndex );..   
2db00 20 20 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d       if( isOptim
2db10 61 6c 20 26 26 20 28 73 43 6f 73 74 2e 70 6c 61  al && (sCost.pla
2db20 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2db30 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d  E_NOT_FULLSCAN)=
2db40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2db50 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b  notIndexed |= m;
2db60 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2db70 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
2db80 73 20 75 6e 64 65 72 20 77 68 69 63 68 20 74 68  s under which th
2db90 69 73 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73  is table becomes
2dba0 20 74 68 65 20 62 65 73 74 20 73 6f 20 66 61 72   the best so far
2dbb0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2dbc0 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68       **   (1) Th
2dbd0 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74  e table must not
2dbe0 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72   depend on other
2dbf0 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76   tables that hav
2dc00 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
2dc10 20 20 20 20 20 20 20 79 65 74 20 72 75 6e 2e 0a         yet run..
2dc20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2dc30 20 20 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75     **   (2) A fu
2dc40 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c  ll-table-scan pl
2dc50 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63  an cannot superc
2dc60 65 64 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e  ede indexed plan
2dc70 20 75 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20   unless.        
2dc80 2a 2a 20 20 20 20 20 20 20 74 68 65 20 66 75 6c  **       the ful
2dc90 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20  l-table-scan is 
2dca0 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61  an "optimal" pla
2dcb0 6e 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f  n as defined abo
2dcc0 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ve..        **. 
2dcd0 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20         **   (3) 
2dce0 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20  All tables have 
2dcf0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2dd00 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62  ause or this tab
2dd10 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20  le lacks an.    
2dd20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44      **       IND
2dd30 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f  EXED BY clause o
2dd40 72 20 74 68 69 73 20 74 61 62 6c 65 20 75 73 65  r this table use
2dd50 73 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 20  s the specific. 
2dd60 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2dd70 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20  index specified 
2dd80 62 79 20 69 74 73 20 49 4e 44 45 58 45 44 20 42  by its INDEXED B
2dd90 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20  Y clause.  This 
2dda0 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20  rule ensures.   
2ddb0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68       **       th
2ddc0 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72  at a best-so-far
2ddd0 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63   is always selec
2dde0 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69  ted even if an i
2ddf0 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20  mpossible.      
2de00 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69    **       combi
2de10 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45  nation of INDEXE
2de20 44 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  D BY clauses are
2de30 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72   given.  The err
2de40 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  or.        **   
2de50 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65      will be dete
2de60 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64  cted and relayed
2de70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70   back to the app
2de80 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a  lication later..
2de90 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2dea0 20 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d   The NEVER() com
2deb0 65 73 20 61 62 6f 75 74 20 62 65 63 61 75 73 65  es about because
2dec0 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20   rule (2) above 
2ded0 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20  prevents.       
2dee0 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64   **       An ind
2def0 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c  exable full-tabl
2df00 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63  e-scan from reac
2df10 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20  hing rule (3).. 
2df20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2df30 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70    **   (4) The p
2df40 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65  lan cost must be
2df50 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f   lower than prio
2df60 72 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20  r plans or else 
2df70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  the.        **  
2df80 20 20 20 20 20 63 6f 73 74 20 6d 75 73 74 20 62       cost must b
2df90 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20 74  e the same and t
2dfa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
2dfb0 73 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 2e  s must be lower.
2dfc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2dfd0 20 20 20 20 69 66 28 20 28 73 43 6f 73 74 2e 75      if( (sCost.u
2dfe0 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30  sed&notReady)==0
2dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e000 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
2e010 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2e020 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74  (bestJ<0 || (not
2e030 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20  Indexed&m)!=0   
2e040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2e050 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  2) */.          
2e060 20 20 20 20 20 20 7c 7c 20 28 62 65 73 74 50 6c        || (bestPl
2e070 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2e080 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2e090 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  SCAN)==0.       
2e0a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f           || (sCo
2e0b0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2e0c0 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2e0d0 53 43 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20  SCAN)!=0).      
2e0e0 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e        && (nUncon
2e0f0 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70  strained==0 || p
2e100 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d  TabItem->pIndex=
2e110 3d 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20  =0   /* (3) */. 
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2e130 7c 20 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70  | NEVER((sCost.p
2e140 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e150 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2e160 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20  )!=0)).         
2e170 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
2e180 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65  | sCost.rCost<be
2e190 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20  stPlan.rCost    
2e1a0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2e1c0 73 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73  sCost.rCost<=bes
2e1d0 74 50 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20  tPlan.rCost .   
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2e1f0 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77   sCost.plan.nRow
2e200 3c 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e  <bestPlan.plan.n
2e210 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b  Row)).        ){
2e220 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
2e230 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c  TRACE(("=== tabl
2e240 65 20 25 64 20 69 73 20 62 65 73 74 20 73 6f 20  e %d is best so 
2e250 66 61 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  far".           
2e260 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74             " wit
2e270 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52  h cost=%g and nR
2e280 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  ow=%g\n",.      
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 6a 2c 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20  j, sCost.rCost, 
2e2b0 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29  sCost.plan.nRow)
2e2c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  );.          bes
2e2d0 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20  tPlan = sCost;. 
2e2e0 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d           bestJ =
2e2f0 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   j;.        }.  
2e300 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
2e310 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
2e320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e330 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e    assert( bestJ>
2e340 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e350 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74  ( notReady & get
2e360 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2e370 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
2e380 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ].iCursor) );.  
2e390 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
2e3a0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c  ** Optimizer sel
2e3b0 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f  ects table %d fo
2e3c0 72 20 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20 20  r loop %d".     
2e3d0 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74             " wit
2e3e0 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52  h cost=%g and nR
2e3f0 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  ow=%g\n",.      
2e400 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c            bestJ,
2e410 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
2e420 61 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  a, bestPlan.rCos
2e430 74 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t, bestPlan.plan
2e440 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 2f 2a 20  .nRow));.    /* 
2e450 54 68 65 20 41 4c 57 41 59 53 28 29 20 74 68 61  The ALWAYS() tha
2e460 74 20 66 6f 6c 6c 6f 77 73 20 77 61 73 20 61 64  t follows was ad
2e470 64 65 64 20 74 6f 20 68 75 73 68 20 75 70 20 63  ded to hush up c
2e480 6c 61 6e 67 20 73 63 61 6e 2d 62 75 69 6c 64 20  lang scan-build 
2e490 2a 2f 0a 20 20 20 20 69 66 28 20 28 62 65 73 74  */.    if( (best
2e4a0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2e4b0 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
2e4c0 59 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28  Y)!=0 && ALWAYS(
2e4d0 70 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20  ppOrderBy) ){.  
2e4e0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
2e4f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2e500 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ( (bestPlan.plan
2e510 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2e520 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b  _DISTINCT)!=0 ){
2e530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e540 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2e550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  ==0 );.      pWI
2e560 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
2e570 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2e580 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20  ORDERED;.    }. 
2e590 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62     andFlags &= b
2e5a0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2e5b0 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
2e5c0 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61  ->plan = bestPla
2e5d0 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74  n.plan;.    test
2e5e0 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70  case( bestPlan.p
2e5f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e600 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
2e610 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
2e620 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2e630 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2e640 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28  INDEX );.    if(
2e650 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
2e660 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2e670 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45  INDEXED|WHERE_TE
2e680 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
2e690 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
2e6a0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2e6b0 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  b++;.    }else{.
2e6c0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
2e6d0 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20  dxCur = -1;.    
2e6e0 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  }.    notReady &
2e6f0 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  = ~getMask(pMask
2e700 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2e710 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2e720 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
2e730 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b  rom = (u8)bestJ;
2e740 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
2e750 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f  n.plan.nRow>=(do
2e760 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20  uble)1 ){.      
2e770 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2e780 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70  op *= bestPlan.p
2e790 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a  lan.nRow;.    }.
2e7a0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
2e7b0 61 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  at if the table 
2e7c0 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20  scanned by this 
2e7d0 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68  loop iteration h
2e7e0 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44  ad an.    ** IND
2e7f0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61  EXED BY clause a
2e800 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74  ttached to it, t
2e810 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  hat the named in
2e820 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20  dex is being.   
2e830 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65   ** used for the
2e840 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74   scan. If not, t
2e850 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c  hen query compil
2e860 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64  ation has failed
2e870 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  ..    ** Return 
2e880 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  an error..    */
2e890 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62  .    pIdx = pTab
2e8a0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70  List->a[bestJ].p
2e8b0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
2e8c0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Idx ){.      if(
2e8d0 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
2e8e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e8f0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20  INDEXED)==0 ){. 
2e900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2e910 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2e920 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78  cannot use index
2e930 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  : %s", pIdx->zNa
2e940 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
2e950 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2e960 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
2e970 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
2e980 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2e990 73 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  se is used, the 
2e9a0 62 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63  bestIndex() func
2e9b0 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20  tion is.        
2e9c0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
2e9d0 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20   find the index 
2e9e0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2e9f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2ea00 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  se.        ** if
2ea10 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65   it find an inde
2ea20 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20  x at all. */.   
2ea30 20 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73       assert( bes
2ea40 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64  tPlan.plan.u.pId
2ea50 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20  x==pIdx );.     
2ea60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57   }.    }.  }.  W
2ea70 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2ea80 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2ea90 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  ed ***\n"));.  i
2eaa0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2eab0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2eac0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2ead0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2eae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2eaf0 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e  e total query on
2eb00 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e  ly selects a sin
2eb10 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68  gle row, then th
2eb20 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
2eb30 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65  clause is irrele
2eb40 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  vant..  */.  if(
2eb50 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
2eb60 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26  RE_UNIQUE)!=0 &&
2eb70 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20   ppOrderBy ){.  
2eb80 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
2eb90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2eba0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2ebb0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2ebc0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2ebd0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2ebe0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2ebf0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2ec00 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2ec10 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2ec20 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
2ec30 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
2ec40 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
2ec50 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2ec60 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
2ec70 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
2ec80 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
2ec90 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
2eca0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2ecb0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2ecc0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
2ecd0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
2ece0 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
2ecf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2ed00 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
2ed10 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20   && (andFlags & 
2ed20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
2ed30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
2ed40 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
2ed50 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2ed60 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
2ed70 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
2ed80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2ed90 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2eda0 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
2edb0 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
2edc0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
2edd0 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
2ede0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
2edf0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
2ee00 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
2ee10 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
2ee20 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
2ee30 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  oto */.  notRead
2ee40 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2ee50 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
2ee60 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  ut = (double)1;.
2ee70 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2ee80 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e  l=pWInfo->a; i<n
2ee90 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c  TabList; i++, pL
2eea0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
2eeb0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
2eec0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
2eed0 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
2eee0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2eef0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
2ef00 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
2ef10 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49  ex */..    pTabI
2ef20 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2ef30 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2ef40 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
2ef50 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2ef60 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
2ef70 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2ef80 75 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66  ursor;.    pWInf
2ef90 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c  o->nRowOut *= pL
2efa0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b  evel->plan.nRow;
2efb0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
2efc0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2efd0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2efe0 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
2eff0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2f000 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
2f010 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2f020 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
2f030 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
2f040 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
2f050 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f060 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
2f070 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2f080 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2f090 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
2f0a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2f0b0 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
2f0c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
2f0d0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
2f0e0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
2f0f0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2f100 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
2f110 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f120 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
2f130 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
2f140 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
2f150 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
2f160 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2f170 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f180 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
2f190 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2f1a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
2f1b0 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30  T_OPEN_CLOSE)==0
2f1c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
2f1d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65   = pWInfo->okOne
2f1e0 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72  Pass ? OP_OpenWr
2f1f0 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61  ite : OP_OpenRea
2f200 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
2f210 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
2f220 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2f230 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
2f240 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  op);.      testc
2f250 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ase( pTab->nCol=
2f260 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
2f270 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e  testcase( pTab->
2f280 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
2f290 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
2f2a0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
2f2b0 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
2f2c0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
2f2d0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
2f2e0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
2f2f0 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
2f300 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
2f310 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
2f320 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f330 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
2f340 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f350 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f370 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
2f380 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
2f390 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f3a0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
2f3b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2f3c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2f3d0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2f3e0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2f3f0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2f400 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
2f410 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f420 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
2f430 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  X.    if( (pLeve
2f440 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2f450 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
2f460 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)!=0 ){.      
2f470 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
2f480 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
2f490 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  pWC, pTabItem, n
2f4a0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29  otReady, pLevel)
2f4b0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
2f4c0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
2f4d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f4e0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2f4f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e  )!=0 ){.      In
2f500 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65  dex *pIx = pLeve
2f510 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
2f520 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2f530 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
2f540 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
2f550 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e  , pIx);.      in
2f560 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
2f570 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2f580 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
2f590 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
2f5a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
2f5b0 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e  assert( iIdxCur>
2f5c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
2f5d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2f5e0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
2f5f0 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
2f600 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2f620 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
2f630 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
2f640 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f650 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
2f660 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
2f670 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
2f680 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2f690 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e  rse, iDb);.    n
2f6a0 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
2f6b0 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
2f6c0 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
2f6d0 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49  rsor);.  }.  pWI
2f6e0 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
2f6f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2f700 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d  dr(v);.  if( db-
2f710 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2f720 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2f730 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  rror;..  /* Gene
2f740 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2f750 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
2f760 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
2f770 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
2f780 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
2f790 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
2f7a0 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
2f7b0 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
2f7c0 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
2f7d0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2f7e0 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
2f7f0 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b  i=0; i<nTabList;
2f800 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65   i++){.    pLeve
2f810 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2f820 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e  ];.    explainOn
2f830 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54  eScan(pParse, pT
2f840 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20  abList, pLevel, 
2f850 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
2f860 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20  , wctrlFlags);. 
2f870 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f     notReady = co
2f880 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70  deOneLoopStart(p
2f890 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46  WInfo, i, wctrlF
2f8a0 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 2c 20  lags, notReady, 
2f8b0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70 57 49  pWhere);.    pWI
2f8c0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2f8d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2f8e0 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
2f8f0 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
2f900 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2f910 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2f920 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
2f930 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
2f940 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
2f950 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
2f960 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
2f970 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
2f980 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
2f990 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
2f9a0 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
2f9b0 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
2f9c0 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
2f9d0 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
2f9e0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
2f9f0 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
2fa00 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
2fa10 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
2fa20 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
2fa30 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
2fa40 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
2fa50 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  0; i<nTabList; i
2fa60 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
2fa70 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
2fa80 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2fa90 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
2faa0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2fab0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2fac0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
2fad0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
2fae0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
2faf0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2fb00 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
2fb10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2fb20 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
2fb30 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
2fb40 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2fb50 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
2fb60 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
2fb70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fb80 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
2fb90 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
2fba0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2fbb0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29  QPlan], "{}", 2)
2fbc0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
2fbd0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
2fbe0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
2fbf0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
2fc00 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
2fc10 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  z, n);.        n
2fc20 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
2fc30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2fc40 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2fc50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
2fc60 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
2fc70 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2fc80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
2fc90 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74  OWID_EQ );.    t
2fca0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
2fcb0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2fcc0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
2fcd0 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
2fce0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2fcf0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
2fd00 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
2fd10 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
2fd20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
2fd30 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2fd40 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20  n], "* ", 2);.  
2fd50 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
2fd60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
2fd70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2fd80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2fd90 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
2fda0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
2fdb0 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
2fdc0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
2fdd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
2fde0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
2fdf0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2fe00 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
2fe10 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
2fe20 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2fe30 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
2fe40 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
2fe50 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
2fe60 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
2fe70 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2fe80 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
2fe90 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
2fea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2feb0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
2fec0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
2fed0 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
2fee0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
2fef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
2ff00 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
2ff10 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2ff20 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
2ff30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2ff40 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
2ff50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
2ff60 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2ff70 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
2ff80 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
2ff90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
2ffa0 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
2ffb0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
2ffc0 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
2ffd0 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
2ffe0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
2fff0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
30000 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
30010 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
30020 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
30030 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
30040 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
30050 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
30060 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
30070 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
30080 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
30090 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
300a0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
300b0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
300c0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
300d0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
300e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
300f0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
30100 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
30110 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
30120 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
30130 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
30140 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
30150 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
30160 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30170 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
30180 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
30190 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
301a0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
301b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
301c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
301d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
301e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
301f0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
30200 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
30210 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
30220 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
30230 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
30240 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
30250 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
30260 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
30270 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
30280 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
30290 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
302a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
302b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
302c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
302d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
302e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
302f0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
30300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
30320 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
30330 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
30340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30350 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
30360 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
30370 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
30380 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
30390 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
303a0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
303b0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
303c0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
303d0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
303e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
303f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30400 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
30410 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
30420 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
30430 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
30440 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
30450 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
30460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30470 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
30480 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
30490 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
304a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
304b0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
304c0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
304d0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
304e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
304f0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
30500 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
30510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
30520 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
30530 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
30540 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30550 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30560 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
30570 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
30580 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
30590 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
305a0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
305b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
305c0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
305d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
305e0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
305f0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30600 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30610 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
30620 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
30630 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30640 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30650 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
30660 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30670 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30680 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
30690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
306a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
306b0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
306c0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
306d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
306e0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
306f0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
30700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30710 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
30720 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
30730 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
30740 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
30750 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
30760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30770 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30780 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
30790 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
307a0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
307b0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
307c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
307d0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
307e0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
307f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
30800 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
30810 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
30820 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
30830 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
30840 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
30850 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30860 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
30870 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
30880 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30890 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
308a0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
308b0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
308c0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
308d0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
308e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
308f0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
30900 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
30910 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
30920 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
30930 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
30940 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
30950 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
30960 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
30970 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
30980 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
30990 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
309a0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
309b0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
309c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
309d0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
309e0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
309f0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
30a00 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
30a10 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
30a20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
30a30 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
30a40 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30a50 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
30a60 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
30a70 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
30a80 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
30a90 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  .wsFlags;.      
30aa0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
30ab0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
30ac0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
30ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
30ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30af0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
30b00 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
30b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30b20 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
30b30 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
30b40 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
30b50 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NDEX)==0 ){.    
30b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30b70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
30b80 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
30b90 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
30ba0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
30bb0 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
30bc0 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65  index, make code
30bd0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
30be0 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
30bf0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
30c00 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20  x in preference 
30c10 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f  to the table. So
30c20 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65  metimes, this me
30c30 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ans.    ** the t
30c40 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20  able need never 
30c50 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68  be read from. Th
30c60 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61  is is a performa
30c70 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a  nce boost,.    *
30c80 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65  * as the vdbe le
30c90 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20  vel waits until 
30ca0 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61  the table is rea
30cb0 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c  d before actuall
30cc0 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67  y.    ** seeking
30cd0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
30ce0 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  r to the record 
30cf0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
30d00 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
30d10 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   ** position in 
30d20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
30d30 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
30d40 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
30d50 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
30d60 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30d70 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
30d80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
30d90 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
30da0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
30db0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
30dc0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
30dd0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
30de0 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
30df0 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
30e00 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
30e10 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
30e20 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
30e30 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
30e40 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
30e50 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
30e60 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
30e70 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30e80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30e90 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21  INDEXED)!=0 && !
30ea0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
30eb0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
30ec0 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
30ed0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
30ee0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
30ef0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
30f00 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
30f10 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
30f20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
30f30 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
30f40 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
30f50 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
30f60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
30f70 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
30f80 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
30f90 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
30fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
30fb0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
30fc0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
30fd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
30fe0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
30ff0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
31000 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
31010 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
31020 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
31030 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
31040 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
31050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31060 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
31070 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
31080 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
31090 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
310a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
310b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
310c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
310d0 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
310e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
310f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
31100 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
31110 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
31120 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
31130 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
31140 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
31150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
31160 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
31170 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
31180 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
31190 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
311a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
311b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
311c0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
311d0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
311e0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
311f0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
31200 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
31210 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
31220 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.