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

Artifact 67c87af7047a913e88fc755aa4de5412af82a3e8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65  ral index */.#de
2c40: 66 69 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49  fine WHERE_DISTI
2c50: 4e 43 54 20 20 20 20 20 30 78 34 30 30 30 30 30  NCT     0x400000
2c60: 30 30 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f  00  /* Correct o
2c70: 72 64 65 72 20 66 6f 72 20 44 49 53 54 49 4e 43  rder for DISTINC
2c80: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  T */../*.** Init
2c90: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
2ca0: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
2cb0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2cd0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
2ce0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d00: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
2d10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2d20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d40: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2d50: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2d60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
2d70: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
2d90: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
2da0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
2db0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2dc0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
2dd0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
2de0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
2df0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
2e00: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
2e10: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2e20: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
2e30: 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a  pWC->vmask = 0;.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2e70: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2e80: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2e90: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2ea0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2eb0: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2ec0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2ed0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2ee0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2ef0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2f00: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2f10: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2f20: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2f30: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2f40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2f50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2f60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2f70: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2f80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f90: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2fa0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2fb0: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2fc0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2fd0: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ff0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3000: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
3010: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
3020: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
3030: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
3040: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
3050: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
3060: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
3070: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
3080: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
30a0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
30b0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
30c0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
30d0: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
30e0: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
30f0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
3100: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
3110: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
3120: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
3130: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3140: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3160: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
3170: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
3180: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3190: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
31a0: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
31b0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
31c0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
31d0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
31e0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
31f0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
3200: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
3210: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
3220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3230: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
3240: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
3250: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3260: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
3270: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
3280: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
3290: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
32a0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
32b0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
32c0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
32d0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
32e0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
32f0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3300: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3310: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3320: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3330: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
3340: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
3350: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
3360: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
3370: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
3380: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
3390: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
33a0: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
33b0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
33c0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
33d0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
33e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
33f0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3400: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3410: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3430: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
3440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
3450: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3460: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
3470: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
3480: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
3490: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
34a0: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
34b0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
34c0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
34d0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
34e0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
34f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3500: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3510: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3520: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3530: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
3540: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3550: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
3560: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
3570: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
3580: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
3590: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
35a0: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
35b0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
35c0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
35d0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
35e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
35f0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3600: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3610: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3620: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3630: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
3640: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
3650: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
3660: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
3670: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
3680: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3690: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
36a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
36b0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
36c0: 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52  UAL );  /* EV: R
36d0: 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a  -00211-15100 */.
36e0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
36f0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3700: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3710: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3720: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3730: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3740: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3750: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3760: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3770: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3780: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3790: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
37a0: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
37b0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
37c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
37e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3800: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3810: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3820: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3830: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3840: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3850: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3860: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3880: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3890: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
38a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38b0: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
38c0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
38d0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
38e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
38f0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3900: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3910: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3920: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3930: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3940: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3950: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3960: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3980: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3990: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
39a0: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
39b0: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
39c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
39d0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
39e0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
39f0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3a00: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3a10: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3a20: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3a30: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3a40: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3a50: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3a60: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3a70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3a80: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3a90: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3aa0: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3ab0: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
3ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
3ad0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3ae0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3af0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3b00: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3b10: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3b20: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3b40: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3b50: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3b60: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3b70: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3b90: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3ba0: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3bb0: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
3bc0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
3bd0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
3be0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3bf0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3c00: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3c10: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3c20: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3c30: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3c40: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3c50: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3c60: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3c70: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3c80: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3c90: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3ca0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3cc0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3cd0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ce0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3cf0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3d00: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3d10: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3d20: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3d40: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3d50: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3d60: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3d70: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3d80: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3d90: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3da0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3db0: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3dc0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3dd0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3de0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3df0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3e00: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3e10: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3e20: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3e30: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3e40: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3e50: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3e60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3e70: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3e80: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3e90: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3ea0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3eb0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ec0: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
3ed0: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
3ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
3ef0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
3f00: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
3f10: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
3f20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3f30: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
3f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3f50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3f60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
3f70: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
3f80: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
3f90: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
3fa0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
3fb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
3fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3fd0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3fe0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
3ff0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
4000: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
4010: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4020: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
4030: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
4040: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
4050: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
4060: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
4070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
4080: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
4090: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
40a0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
40b0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
40c0: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
40d0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
40e0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
40f0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
4100: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
4110: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4120: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
4130: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
4140: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
4150: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
4160: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
4170: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
4180: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
4190: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
41a0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
41b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
41c0: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
41d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
41e0: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
41f0: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
4200: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
4210: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
4220: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
4230: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
4240: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
4250: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
4260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
4270: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52  .** The sqlite3R
4280: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4290: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
42a0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
42b0: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
42c0: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
42d0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
42e0: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
42f0: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
4300: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
4310: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
4320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
4330: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
4340: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
4350: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
4360: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
4370: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
4380: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
4390: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
43a0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
43b0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
43c0: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
43d0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
43e0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
43f0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4400: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
4410: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4420: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
4430: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4440: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
4450: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
4460: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
4470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4480: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4490: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
44a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
44b0: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
44c0: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
44d0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
44e0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44f0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
4500: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
4510: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4520: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
4530: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4540: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4550: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
4560: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
4570: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4580: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
4590: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
45a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
45b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
45c0: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
45d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
45e0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
45f0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4600: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4610: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4620: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4630: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
4640: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4650: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
4660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4680: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
4690: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46a0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
46b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
46d0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
46e0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
46f0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
4700: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4710: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
4720: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4730: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
4740: 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  S ){.    mask |=
4750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4760: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4770: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
4780: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4790: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
47a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
47b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
47c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
47d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
47e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
47f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4800: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4810: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
4820: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4830: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4840: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
4850: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4860: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4870: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4880: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4890: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
48a0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
48b0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
48c0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
48d0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
48e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
48f0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4900: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4910: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4920: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4930: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4940: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4950: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4960: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4970: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4980: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
49a0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
49b0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
49c0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
49d0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
49e0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
49f0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4a00: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4a10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4a20: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a30: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4a40: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4a50: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4a60: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a70: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4a80: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4a90: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4aa0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4ab0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4ad0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4ae0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4af0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4b00: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b10: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4b20: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4b30: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4b40: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4b50: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b60: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4b70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4b80: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4b90: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ba0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4bb0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4bc0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4bd0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4be0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4bf0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4c00: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4c10: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4c20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4c30: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4c40: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4c50: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4c60: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4c70: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4c80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4c90: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4ca0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4cb0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4cc0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4cd0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
4ce0: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
4cf0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
4d00: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
4d10: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
4d20: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
4d30: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
4d40: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
4d50: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
4d60: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
4d70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4d80: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
4d90: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
4da0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
4db0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
4dc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
4dd0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
4de0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
4df0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
4e00: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
4e10: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
4e20: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
4e30: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
4e40: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4e50: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4e60: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
4e70: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
4e80: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
4e90: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
4ea0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
4eb0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
4ec0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
4ed0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
4ee0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
4ef0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
4f00: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
4f10: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
4f20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4f30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4f40: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
4f50: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
4f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4f70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
4f90: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
4fa0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
4fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
4fc0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
4fd0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
4fe0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4ff0: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5000: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5010: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5020: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5030: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5040: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5050: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5060: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5070: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
5080: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
5090: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
50a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
50b0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
50c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
50d0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
50e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
50f0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5100: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5110: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5120: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5130: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5140: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5150: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5160: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5170: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
5180: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
5190: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
51a0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
51b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
51c0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
51d0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
51e0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
51f0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5200: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5210: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5220: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5230: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5240: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5250: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5260: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5270: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
5280: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
5290: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
52a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
52b0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
52c0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
52d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
52e0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
52f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5300: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5310: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5320: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5330: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5340: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5350: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5360: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5370: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
5380: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5390: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
53a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
53c0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
53d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
53e0: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
53f0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5400: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5410: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5420: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5430: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5440: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5450: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5460: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5470: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
5480: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
5490: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
54a0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
54b0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
54c0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
54d0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
54e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
54f0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5500: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5510: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5520: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5530: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5540: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5550: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5570: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
5580: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
5590: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
55a0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
55b0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
55c0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55e0: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
55f0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5600: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5610: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5620: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5630: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5640: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5650: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5660: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5670: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
5680: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
5690: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
56a0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
56b0: 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
56c0: 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
56d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
56e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
56f0: 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  ur.       && (pT
5700: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5710: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
5720: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
5730: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
5740: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26  Column.       &&
5750: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
5760: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
5770: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
5780: 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  x && pTerm->eOpe
5790: 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c  rator!=WO_ISNULL
57a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
57b0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
57c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  xpr;.        Col
57d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
57e0: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
57f0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
5800: 0a 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a  .        Parse *
5810: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
5820: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  arse;..        i
5830: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
5840: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
5850: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
5860: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
5870: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
5880: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
5890: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
58a0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
58b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
58c0: 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64  equence required
58d0: 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66   from an index f
58e0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  or.        ** it
58f0: 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f   to be useful fo
5900: 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70  r optimising exp
5910: 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72  ression pX. Stor
5920: 65 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  e this.        *
5930: 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61  * value in varia
5940: 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20  ble pColl..     
5950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
5960: 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b  sert(pX->pLeft);
5970: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
5980: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
5990: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
59a0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
59b0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
59c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c       assert(pCol
59d0: 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  l || pParse->nEr
59e0: 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  r);..        for
59f0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
5a00: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
5a10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5a20: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
5a30: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
5a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5a50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5a60: 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  pColl && sqlite3
5a70: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
5a80: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
5a90: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
5aa0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5ab0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
5ac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5ad0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
5ae0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5af0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5b00: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
5b10: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
5b20: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
5b30: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
5b40: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
5b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
5b60: 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  **.**.*/.static 
5b70: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5b80: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
5b90: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5ba0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5bb0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5bc0: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5bd0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5be0: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5bf0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5c10: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5c20: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5c30: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
5c40: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
5c50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5c60: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
5c70: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
5c80: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
5c90: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5ca0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5cb0: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5cc0: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5cd0: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5ce0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5cf0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5d00: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5d10: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5d20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5d30: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
5d40: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
5d50: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
5d60: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
5d70: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
5d80: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
5d90: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5db0: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5dd0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5de0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5df0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5e00: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5e10: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5e20: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5e30: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
5e40: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
5e50: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
5e60: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
5e70: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
5e80: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
5e90: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5ea0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5eb0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5ec0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5ed0: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5ee0: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5ef0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5f00: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5f20: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5f30: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
5f40: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5f50: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
5f60: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
5f70: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
5f80: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
5f90: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5fa0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5fc0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5fd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5fe0: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6000: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
6010: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
6020: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
6030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6040: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
6050: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
6060: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
6070: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
6080: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
6090: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
60a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
60b0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
60c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
60d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
60e0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
60f0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
6100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
6110: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
6120: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
6130: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
6140: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
6150: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
6160: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
6170: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
6180: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
6190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
61a0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
61b0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
61c0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
61d0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
61e0: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
61f0: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
6200: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
6210: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
6220: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
6230: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
6240: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
6250: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
6260: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
6270: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
6280: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
6290: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
62a0: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
62b0: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
62c0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
62d0: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
62e0: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
62f0: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
6300: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a  as AFF_TEXT */..
6310: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
6320: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6330: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
6340: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
6350: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
6360: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
6370: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
6380: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
6390: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
63a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
63b0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
63c0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
63d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
63e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
63f0: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
6400: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
6410: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
6420: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
6430: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
6440: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
6450: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
6460: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
6480: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6490: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
64a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
64b0: 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  Col); /* IMP: R-
64c0: 32 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20  23257-02778 */. 
64d0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
64e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
64f0: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
6500: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
6510: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
6520: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
6530: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
6540: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
6550: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
6560: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
6570: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
6580: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
6590: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
65a0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
65b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
65c0: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
65d0: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
65e0: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
65f0: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
6600: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
6610: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
6620: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
6630: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
6640: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
6650: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
6660: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
6670: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
6680: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
6690: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
66a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
66b0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
66c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
66d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
66e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
66f0: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
6700: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f 2a 20 49  ->iColumn); /* I
6710: 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37  MP: R-23257-0277
6720: 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  8 */.        if(
6730: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
6740: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
6750: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
6760: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
6770: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
6780: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
6790: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
67a0: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
67b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
67c0: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
67d0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
67e0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
67f0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
6800: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
6810: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
6820: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
6830: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
6840: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
6850: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
6860: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
6870: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
6880: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
6890: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
68a0: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
68b0: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
68c0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
68d0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
68e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
68f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6900: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
6910: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
6920: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
6930: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
6940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6950: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
6960: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6970: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
6980: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6990: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
69a0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
69b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
69c0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
69e0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
69f0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
6a00: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
6a10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6a20: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
6a30: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
6a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6a50: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
6a60: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6a70: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6a80: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6a90: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6aa0: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
6ab0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
6ac0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
6ad0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
6ae0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
6af0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
6b00: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
6b10: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6b20: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6b30: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6b40: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6b50: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6b60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6b90: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
6ba0: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
6bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6bc0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
6bd0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
6be0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
6bf0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
6c00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6c10: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6c20: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
6c30: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
6c40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6c50: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
6c60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6c70: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
6c80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
6c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
6ca0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
6cb0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6cc0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
6cd0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
6ce0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
6cf0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
6d00: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
6d10: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
6d20: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
6d30: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
6d40: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
6d50: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
6d60: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6d70: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
6d80: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6d90: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6da0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6db0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
6dd0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
6de0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6df0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
6e00: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
6e10: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
6e20: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
6e30: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
6e40: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
6e50: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
6e60: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
6e70: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
6e80: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
6e90: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
6eb0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6ec0: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
6ed0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
6ee0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
6ef0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
6f00: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
6f10: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
6f20: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6f30: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
6f40: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
6f50: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
6f60: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
6f70: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
6f80: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
6f90: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
6fa0: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
6fb0: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
6fc0: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
6fd0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
6fe0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
6ff0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
7000: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
7010: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
7020: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
7030: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
7040: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
7050: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
7060: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
7070: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7080: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7090: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
70a0: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
70b0: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
70c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
70d0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
70e0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
70f0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
7100: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
7110: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
7120: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
7130: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7140: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7150: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7160: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7170: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7180: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7190: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
71a0: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
71b0: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
71c0: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
71d0: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
71e0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
71f0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7200: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7210: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7220: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7230: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7240: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7250: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7260: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7270: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7280: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7290: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
72a0: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
72b0: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
72c0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
72d0: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
72e0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
72f0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7300: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7310: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7320: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7330: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7340: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7350: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7360: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7370: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7380: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7390: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
73a0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
73b0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
73c0: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
73d0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
73e0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
73f0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7400: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7410: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7420: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7430: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7440: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7450: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7460: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7470: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7480: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7490: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
74a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
74b0: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
74c0: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
74d0: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
74e0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
74f0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7500: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7510: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7520: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7530: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7540: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7550: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7560: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7570: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7580: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7590: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
75a0: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
75b0: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
75c0: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
75d0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
75e0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
75f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7600: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7610: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7620: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7630: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7640: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7650: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7660: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7670: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7680: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7690: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
76a0: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
76b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
76c0: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
76d0: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
76e0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
76f0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7700: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7710: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7720: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7730: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
7740: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7750: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7760: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7770: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7780: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
7790: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
77a0: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
77b0: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
77c0: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
77d0: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
77e0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
77f0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
7800: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
7810: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
7820: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
7830: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
7840: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
7850: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
7860: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
7870: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
7880: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
7890: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
78a0: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
78b0: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
78c0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
78d0: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
78e0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
78f0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
7900: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
7910: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
7920: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
7930: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
7940: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
7950: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
7960: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
7970: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
7980: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
7990: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
79a0: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
79b0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
79c0: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
79d0: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
79e0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
79f0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
7a00: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7a10: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
7a20: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
7a30: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
7a50: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
7a60: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7a80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7a90: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7aa0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
7ab0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
7ac0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
7ad0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
7ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7af0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
7b00: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7b10: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
7b20: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
7b30: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
7b40: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7b50: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
7b60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7b70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7b80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7b90: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
7ba0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
7bb0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7bc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
7bd0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7be0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7bf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
7c20: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
7c30: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7c40: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
7c50: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
7c60: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
7c70: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7ca0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
7cb0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
7cc0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
7cd0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
7ce0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
7cf0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
7d00: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
7d10: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
7d20: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
7d30: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
7d40: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
7d50: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7d60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7d70: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
7d80: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
7d90: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7da0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7db0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
7dc0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
7dd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
7de0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
7df0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
7e00: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
7e10: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
7e20: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7e30: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
7e40: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
7e50: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
7e60: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
7e70: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
7e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
7e90: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
7ea0: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
7eb0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
7ec0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
7ed0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
7ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
7ef0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7f00: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
7f10: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
7f20: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
7f30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7f40: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
7f50: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
7f60: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
7f70: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7f80: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
7f90: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
7fa0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
7fb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
7fc0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
7fd0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
7fe0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
7ff0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
8000: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
8010: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68   pMaskSet);.  wh
8020: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
8030: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
8040: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8050: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
8060: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
8070: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8080: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
8090: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
80a0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
80b0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
80c0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
80d0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
80e0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
80f0: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
8100: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8110: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
8120: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8130: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8140: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
8150: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
8160: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8170: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
8180: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8190: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
81a0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
81b0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
81c0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
81d0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
81e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
81f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8200: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8210: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
8220: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
8230: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
8240: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
8250: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8260: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
8270: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
8280: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8290: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
82a0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
82b0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
82c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
82d0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
82e0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
82f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
8300: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8310: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8320: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8330: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
8340: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
8350: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
8360: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
8370: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
8380: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8390: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
83a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
83b0: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
83c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
83d0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
83e0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
83f0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8400: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8410: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
8420: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8430: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8440: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8450: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8460: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8470: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8480: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8490: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
84a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
84b0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
84c0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
84d0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
84e0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
84f0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8500: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8510: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8520: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8530: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8550: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8560: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8570: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8580: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8590: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
85a0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
85b0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
85c0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
85d0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
85e0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
85f0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8600: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8610: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8630: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8640: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8650: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8660: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8670: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8680: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8690: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
86a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
86b0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
86c0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
86d0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
86e0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
86f0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
8700: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
8710: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
8720: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
8730: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
8740: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
8750: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
8760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8770: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
8780: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8790: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
87a0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
87b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
87c0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
87d0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
87e0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
87f0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
8800: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
8810: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
8820: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
8830: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
8840: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
8850: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
8860: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8870: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
8880: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
8890: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
88a0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
88b0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
88c0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
88d0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
88e0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
88f0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
8900: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
8910: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
8920: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
8930: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
8940: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
8950: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
8960: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
8970: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
8980: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
8990: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
89a0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
89b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
89c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
89d0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
89e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
89f0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
8a00: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
8a10: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
8a20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
8a30: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
8a40: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
8a50: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
8a60: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
8a70: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
8a80: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
8a90: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
8aa0: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
8ab0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
8ac0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
8ad0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
8ae0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
8af0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
8b00: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
8b10: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
8b20: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
8b30: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
8b40: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
8b50: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
8b60: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
8b70: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
8b80: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
8b90: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
8ba0: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
8bb0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
8bc0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
8bd0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
8be0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8bf0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
8c00: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
8c10: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
8c20: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8c30: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
8c40: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
8c50: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
8c60: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
8c70: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
8c80: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
8c90: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
8ca0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
8cb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8cc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8cd0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
8ce0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
8cf0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
8d00: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8d10: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
8d20: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
8d30: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
8d40: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
8d50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
8d60: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
8d70: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
8d80: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
8d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8da0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8db0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8dc0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8dd0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8de0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8df0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8e00: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8e10: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8e20: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8e30: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8e40: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
8e50: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
8e60: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
8e70: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
8e80: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
8e90: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8ea0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8eb0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8ec0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8ed0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8ee0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8ef0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8f00: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8f10: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8f20: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8f30: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8f40: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
8f50: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
8f60: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8f70: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
8f80: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fa0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8fb0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8fc0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8fd0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8fe0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8ff0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9000: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9020: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
9030: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
9040: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9050: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
9060: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9070: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9080: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9090: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
90a0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
90b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
90c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
90d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
90e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
90f0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9100: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9110: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9120: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9130: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9140: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9150: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9160: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9170: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9180: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9190: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
91a0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
91b0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
91c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
91d0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
91e0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
91f0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9200: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9210: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9220: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9230: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9240: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9250: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9260: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9270: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9280: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9290: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
92a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
92b0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
92c0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
92d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
92e0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
92f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9300: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9310: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9320: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9330: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9340: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9350: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9360: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9370: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9380: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9390: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
93a0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
93b0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
93c0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
93d0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
93e0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
93f0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9400: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9410: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9420: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9430: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9440: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9450: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9480: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9490: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
94a0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
94b0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
94c0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
94d0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
94e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
94f0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9500: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9510: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9520: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9530: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9540: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9550: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9560: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9580: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9590: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
95a0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
95b0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
95c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
95d0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
95e0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
95f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9600: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9610: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9630: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9650: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9660: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9680: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9690: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
96a0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
96b0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
96c0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
96d0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
96e0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
96f0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
9700: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
9710: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
9720: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
9730: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
9740: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
9750: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
9760: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9770: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9780: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
9790: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
97a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
97b0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
97c0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
97e0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
97f0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
9800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
9810: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9820: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
9840: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
9850: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
9860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9870: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9880: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9890: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
98a0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
98b0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
98c0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
98d0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
98e0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
98f0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
9900: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
9910: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
9920: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
9930: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a  operator..    **
9940: 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30  .    ** EV: R-00
9950: 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f  211-15100.    */
9960: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
9970: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
9980: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
9990: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
99a0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
99b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
99c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
99d0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
99e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
99f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9a00: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
9a10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
9a20: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9a30: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
9a40: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9a50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
9a60: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
9a70: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
9a80: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
9a90: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9aa0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9ab0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9ac0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
9ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9ae0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
9af0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
9b00: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9b10: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
9b20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b30: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
9b40: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9b50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b60: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
9b70: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
9b80: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
9b90: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9ba0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9bb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9bc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9be0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
9bf0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9c00: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9c10: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9c20: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9c30: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c40: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9c50: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9c60: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9c70: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
9c80: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
9c90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9ca0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
9cb0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
9cc0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
9cd0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9ce0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9cf0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9d10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9d20: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9d30: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9d40: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9d50: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9d60: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9d70: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9d80: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
9d90: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
9da0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9db0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
9dc0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
9dd0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9de0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9df0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9e00: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9e10: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9e20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9e30: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9e40: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9e70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
9e80: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9e90: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
9ea0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
9eb0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
9ec0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
9ed0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9ee0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9ef0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9f00: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9f10: 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  BQUERY */.../*.*
9f20: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
9f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9f40: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
9f50: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
9f60: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
9f70: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
9f80: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
9f90: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
9fa0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
9fb0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
9fc0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
9fd0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9fe0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
9ff0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
a000: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a010: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
a020: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
a030: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
a040: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
a050: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
a060: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
a070: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a080: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
a090: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
a0a0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
a0b0: 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c  and Y are.** col
a0c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
a0d0: 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69  riginal expressi
a0e0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
a0f0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
a100: 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65  l.** term of the
a110: 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22   form "Y <op> X"
a120: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
a140: 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65  d.** analyzed se
a150: 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f  parately.  The o
a160: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20  riginal term is 
a170: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
a180: 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74  _COPIED.** and t
a190: 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d  he new term is m
a1a0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
a1b0: 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65  DYNAMIC (because
a1c0: 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e   it's pExpr.** n
a1d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
a1e0: 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43   with the WhereC
a1f0: 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f  lause) and TERM_
a200: 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65  VIRTUAL (because
a210: 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d   it.** is a comm
a220: 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70  uted copy of a p
a230: 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65  rior term.)  The
a240: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68   original term h
a250: 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61  as nChild=1.** a
a260: 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20  nd the copy has 
a270: 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f  idxParent set to
a280: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
a290: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
a2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a2b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
a2c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
a2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a2e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a2f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a300: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
a310: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a320: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
a350: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
a360: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
a370: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
a380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a390: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
a3a0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
a3b0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
a3c0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
a3d0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
a3e0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
a3f0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a410: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a420: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a430: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
a440: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
a450: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
a460: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
a470: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
a480: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
a490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a4a0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
a4b0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
a4c0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
a4d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
a4e0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
a4f0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
a500: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
a510: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
a520: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
a530: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
a540: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
a550: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a570: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a580: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
a590: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
a5a0: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
a5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
a5c0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
a5d0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
a5e0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
a610: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
a620: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
a630: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
a640: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
a650: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
a660: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a670: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
a680: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a690: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
a6a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a6b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
a6c0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
a6d0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
a6e0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
a6f0: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
a700: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
a710: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
a720: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
a730: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
a740: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
a750: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
a760: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
a770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
a780: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
a790: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
a7a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a7b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a7c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a7d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a7e0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
a7f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a800: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
a810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a820: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a830: 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  t = exprListTabl
a840: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a850: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
a860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
a870: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
a880: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
a890: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
a8a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
a8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a8c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
a8d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a8e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
a8f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
a900: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
a910: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
a920: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a930: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
a940: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
a950: 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d  Bitmask x = getM
a960: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
a970: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
a980: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
a990: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
a9a0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
a9b0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
a9c0: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
a9d0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
a9e0: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
a9f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
aa00: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
aa10: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
aa20: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a  et #3015 */.  }.
aa30: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
aa40: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
aa50: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
aa60: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
aa70: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
aa80: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
aa90: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
aaa0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
aab0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
aac0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
aad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
aae0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
aaf0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
ab00: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
ab10: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
ab20: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
ab30: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
ab40: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ab50: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ab60: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
ab70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
ab80: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
ab90: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
aba0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
abb0: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
abc0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
abd0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
abe0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
abf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
ac00: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
ac10: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
ac20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
ac30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
ac40: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
ac50: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
ac60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
ac70: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
ac80: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ac90: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
aca0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
acb0: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
acc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
acd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ace0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
acf0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
ad00: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
ad10: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ad20: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
ad30: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
ad40: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
ad50: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
ad60: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
ad70: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
ad80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
ad90: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ada0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
adb0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
adc0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
add0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
ade0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
adf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
ae00: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
ae10: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
ae20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae30: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
ae40: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
ae50: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
ae60: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
ae70: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ae80: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
ae90: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
aea0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aeb0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
aec0: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
aed0: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
aee0: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
aef0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
af00: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
af10: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
af20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
af30: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
af40: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
af50: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
af60: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
af70: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
af80: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
afa0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
afb0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
afc0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
afd0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
afe0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
aff0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
b000: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
b010: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
b020: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
b030: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
b040: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
b050: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
b060: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
b070: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
b080: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
b090: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
b0a0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
b0b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
b0c0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
b0d0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
b0e0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
b0f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
b100: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
b110: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
b120: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
b130: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b140: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
b150: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
b160: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
b170: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
b180: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
b190: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
b1a0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
b1b0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
b1c0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
b1d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
b1e0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
b1f0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
b200: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
b210: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
b220: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
b230: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
b240: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
b250: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b260: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
b270: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
b280: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
b290: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
b2a0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
b2b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
b2c0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
b2d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
b2e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b2f0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
b300: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
b310: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
b320: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b330: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b360: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b370: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
b3b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
b3c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b3d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b3e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b3f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
b400: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b410: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
b420: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
b430: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
b440: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b450: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
b460: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b470: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
b480: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
b490: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b4a0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
b4b0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
b4c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b4d0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
b4e0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
b4f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b500: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b510: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
b520: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b530: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
b540: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
b550: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
b560: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
b570: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
b580: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
b590: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
b5a0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
b5b0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
b5c0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
b5d0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
b5e0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
b5f0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
b600: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
b610: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b620: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
b630: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b640: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
b650: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b660: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
b670: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
b680: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
b690: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
b6a0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
b6b0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
b6c0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
b6d0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
b6e0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
b6f0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
b700: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
b710: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
b720: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
b730: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
b740: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
b750: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
b760: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
b770: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
b780: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
b790: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
b7a0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
b7b0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
b7c0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
b7d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
b7e0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
b7f0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
b800: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
b810: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
b820: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
b830: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
b840: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b850: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b860: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
b870: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
b880: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
b890: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
b8a0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
b8b0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
b8c0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
b8d0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
b8e0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
b8f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b900: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
b910: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
b920: 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  se */..    pLeft
b930: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b940: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
b950: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
b960: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
b970: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
b980: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b990: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b9a0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b9b0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b9c0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b9d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b9e0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b9f0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
ba00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
ba10: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
ba20: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
ba30: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
ba40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
ba50: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
ba60: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
ba70: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
ba80: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
ba90: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
baa0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
bab0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
bac0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
bad0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
bae0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
baf0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
bb00: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
bb10: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
bb20: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
bb30: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
bb40: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
bb50: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
bb60: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
bb70: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
bb80: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
bb90: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
bba0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
bbb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bbc0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
bbd0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
bbe0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
bbf0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
bc00: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
bc10: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
bc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc30: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
bc40: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
bc50: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bc60: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
bc70: 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43  8, noCase ? "NOC
bc80: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c  ASE" : "BINARY",
bc90: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
bca0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
bcb0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bce0: 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33  rSetColl(sqlite3
bcf0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
bd00: 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20  ,0), pColl),.   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20    pStr1, 0);.   
bd30: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
bd40: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
bd50: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
bd60: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
bd70: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
bd80: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
bd90: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
bda0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
bdb0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
bdc0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
bdd0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bde0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
bdf0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be00: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
be10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
be20: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
be30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be40: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
be50: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
be60: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
be70: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
be80: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be90: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
bea0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
beb0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
bec0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
bed0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
bee0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bef0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
bf00: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
bf10: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
bf20: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
bf30: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
bf40: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
bf50: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
bf60: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
bf70: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
bf80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
bf90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
bfa0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
bfb0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
bfc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bfd0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
bfe0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
bff0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c000: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c010: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c020: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c030: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c040: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c050: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c060: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c070: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c080: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c090: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c0a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c0b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c0c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c0d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c0e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c0f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
c100: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
c110: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
c120: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
c130: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
c140: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
c150: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
c160: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
c170: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
c180: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
c190: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c1a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c1b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
c1c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
c1d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
c1e0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
c1f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c200: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
c210: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
c220: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c230: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
c240: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
c250: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
c260: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
c270: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
c280: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
c290: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c2a0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
c2d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c2e0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
c2f0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
c300: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c310: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c320: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
c330: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c340: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c350: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
c360: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
c370: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
c380: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c390: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
c3a0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
c3b0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c3c0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c3d0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c3e0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c3f0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
c400: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
c410: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c420: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
c430: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c440: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c450: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c460: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c470: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c480: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c490: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c4a0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c4b0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c4c0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c4d0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c4e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c4f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c500: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
c510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c520: 54 41 54 32 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT2.  /* When s
c530: 71 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74  qlite_stat2 hist
c540: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
c550: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
c560: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
c570: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
c580: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
c590: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
c5a0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
c5b0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
c5c0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
c5d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c5e0: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
c5f0: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
c600: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
c610: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
c620: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
c630: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
c640: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
c650: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
c660: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
c670: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
c680: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
c690: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
c6a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
c6b0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
c6c0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
c6d0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
c6e0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
c6f0: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
c700: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
c710: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
c720: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
c730: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
c740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
c750: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
c760: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
c770: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
c780: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
c790: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
c7a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
c7b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
c7c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
c7d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
c7e0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
c7f0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
c800: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
c810: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c820: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
c850: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c880: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c890: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
c8a0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
c8b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c8c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c8d0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
c900: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
c910: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
c920: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
c930: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c940: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c950: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c960: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
c970: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c980: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c990: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c9a0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c9b0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c9c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c9d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c9e0: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
c9f0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
ca00: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ca10: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
ca20: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ca30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
ca40: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ca50: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
ca60: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
ca70: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ca80: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
ca90: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
caa0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
cab0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
cac0: 53 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a 20 50  STAT2 */..  /* P
cad0: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
cae0: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
caf0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
cb00: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
cb10: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
cb20: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
cb30: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
cb40: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
cb50: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
cb60: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
cb70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cb80: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
cb90: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
cba0: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
cbb0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
cbc0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
cbd0: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
cbe0: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
cbf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cc00: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
cc10: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
cc20: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
cc30: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
cc40: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
cc50: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
cc60: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
cc70: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
cc80: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
cc90: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
cca0: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
ccb0: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
ccc0: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
ccd0: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
cce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
cd10: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
cd20: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
cd30: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
cd40: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
cd50: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
cd60: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
cd70: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
cd80: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
cd90: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
cda0: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
cdb0: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
cdc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cdd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
cde0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cdf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ce00: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
ce10: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
ce20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
ce30: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
ce40: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
ce50: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
ce60: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
ce70: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
ce80: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
ce90: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
cea0: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
ceb0: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
cec0: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
ced0: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
cee0: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
cef0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
cf00: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
cf10: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
cf20: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
cf30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
cf40: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
cf50: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
cf60: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
cf70: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
cf80: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
cf90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
cfa0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
cfb0: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
cfc0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
cfd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
cfe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
cff0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d010: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d020: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d030: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d060: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d070: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d080: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0a0: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d0b0: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d0c0: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0e0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d0f0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d100: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d110: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d120: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d130: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d140: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d150: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d160: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d170: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
d180: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
d190: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
d1a0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
d1b0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
d1c0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
d1d0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
d1e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
d1f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d200: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
d210: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
d220: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
d230: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d240: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d250: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d260: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d270: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d280: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
d290: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72  is routine deter
d2a0: 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63 61  mines if pIdx ca
d2b0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73 73  n be used to ass
d2c0: 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  ist in processin
d2d0: 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20  g a.** DISTINCT 
d2e0: 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74  qualifier. In ot
d2f0: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65  her words, it te
d300: 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  sts whether or n
d310: 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a  ot using this.**
d320: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f   index for the o
d330: 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e  uter loop guaran
d340: 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20 77  tees that rows w
d350: 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73  ith equal values
d360: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72   for.** all expr
d370: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70  essions in the p
d380: 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72  Distinct list ar
d390: 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75  e delivered grou
d3a0: 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  ped together..**
d3b0: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
d3c0: 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a   the query .**.*
d3d0: 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  *   SELECT DISTI
d3e0: 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  NCT a, b, c FROM
d3f0: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f   tbl WHERE a = ?
d400: 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66  .**.** can benef
d410: 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65  it from any inde
d420: 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22  x on columns "b"
d430: 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61   and "c"..*/.sta
d440: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
d450: 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ctIndex(.  Parse
d460: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d480: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d490: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
d4a0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
d4b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
d4c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65  clause */.  Inde
d4d0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d4f0: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
d500: 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69  onsidered */.  i
d510: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d530: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
d540: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 49  for the table pI
d550: 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78  dx is on */.  Ex
d560: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
d570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
d580: 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   The DISTINCT ex
d590: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69  pressions */.  i
d5a0: 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20  nt nEqCol       
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
d5d0: 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d  x columns with =
d5e0: 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  = */.){.  Bitmas
d5f0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  k mask = 0;     
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
d610: 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64  k of unaccounted
d620: 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65   for pDistinct e
d630: 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  xprs */.  int i;
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d660: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
d670: 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  /..  if( pIdx->z
d680: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74  Name==0 || pDist
d690: 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74  inct==0 || pDist
d6a0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  inct->nExpr>=BMS
d6b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
d6c0: 65 73 74 63 61 73 65 28 20 70 44 69 73 74 69 6e  estcase( pDistin
d6d0: 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  ct->nExpr==BMS-1
d6e0: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
d6f0: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65  hrough all the e
d700: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
d710: 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e  e distinct list.
d720: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a   If any of them.
d730: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d    ** are not sim
d740: 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  ple column refer
d750: 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61  ences, return ea
d760: 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rly. Otherwise, 
d770: 74 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  test if the.  **
d780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
d790: 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22  ntains a "col=X"
d7a0: 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64   clause. If it d
d7b0: 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73  oes, the express
d7c0: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ion.  ** can be 
d7d0: 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64  ignored. If it d
d7e0: 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65  oes not, and the
d7f0: 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74   column does not
d800: 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20   belong to the. 
d810: 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61   ** same table a
d820: 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65  s index pIdx, re
d830: 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61  turn early. Fina
d840: 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73  lly, if there is
d850: 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e   no.  ** matchin
d860: 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73  g "col=X" expres
d870: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c  sion and the col
d880: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61  umn is on the sa
d890: 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78  me table as pIdx
d8a0: 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63  ,.  ** set the c
d8b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
d8c0: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73   in variable mas
d8d0: 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  k..  */.  for(i=
d8e0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
d8f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d900: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d910: 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  m;.    Expr *p =
d920: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
d930: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d940: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
d950: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
d960: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
d970: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
d980: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
d990: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
d9a0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
d9b0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
d9c0: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
d9d0: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
d9e0: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
d9f0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
da00: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
da10: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
da20: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
da30: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
da40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
da50: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
da60: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
da70: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
da80: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
da90: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
daa0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
dab0: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
dac0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
dad0: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
dae0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
daf0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
db00: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
db10: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
db20: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
db30: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
db40: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
db50: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
db60: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
db70: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
db80: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
db90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
dba0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
dbb0: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
dbc0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
dbd0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
dbe0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
dbf0: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
dc00: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
dc10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
dc20: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
dc30: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
dc40: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
dc50: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
dc60: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
dc70: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
dc80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dc90: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
dca0: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
dcb0: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
dcc0: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
dcd0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
dce0: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
dcf0: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
dd00: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
dd10: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
dd40: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
dd50: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
dd60: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
dd70: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
dd80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
dd90: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
dda0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
ddb0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
ddc0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
ddd0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
dde0: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
ddf0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
de00: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
de10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
de20: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
de30: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
de40: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
de50: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
de60: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
de70: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
de80: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
de90: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
dea0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
deb0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
dec0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
ded0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
dee0: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
def0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
df00: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
df10: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
df20: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
df30: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
df40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
df50: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69     Expr *p = pDi
df60: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
df70: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
df80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
df90: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
dfa0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
dfb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
dfc0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
dfd0: 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
dfe0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
dff0: 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
e000: 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
e010: 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
e020: 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
e030: 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
e040: 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
e050: 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
e060: 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
e070: 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
e080: 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
e090: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
e0a0: 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
e0b0: 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
e0c0: 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
e0d0: 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
e0e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
e0f0: 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
e100: 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
e110: 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
e120: 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
e130: 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
e140: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e150: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
e160: 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
e170: 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
e180: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
e190: 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
e1a0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
e1b0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e1c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e1d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e1e0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
e1f0: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
e200: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
e210: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
e220: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
e230: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e240: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
e250: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
e260: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
e270: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
e280: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
e290: 64 78 29 20 0a 20 20 20 20 20 20 20 26 26 20 30  dx) .       && 0
e2a0: 3e 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50  >findIndexCol(pP
e2b0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
e2c0: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
e2d0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
e2e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e2f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e300: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
e310: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e320: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
e330: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
e340: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
e350: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
e360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e370: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
e380: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
e390: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
e3a0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
e3b0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
e3c0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
e3d0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
e3e0: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
e3f0: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
e400: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
e410: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e420: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
e430: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
e440: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
e450: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
e460: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
e470: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
e480: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e490: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
e4a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
e4b0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
e4c0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
e4d0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
e4e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
e4f0: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
e500: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
e510: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
e520: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e530: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
e540: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
e550: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
e560: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
e570: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
e580: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
e590: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
e5a0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
e5b0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
e5c0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
e5d0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
e5e0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
e5f0: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
e600: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
e610: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
e620: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
e630: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
e640: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
e650: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
e660: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
e670: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
e680: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
e690: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
e6a0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
e6b0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
e6c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e6d0: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
e6e0: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
e6f0: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
e700: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
e710: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
e720: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
e730: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
e740: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e750: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e760: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
e770: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
e780: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
e790: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
e7a0: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
e7b0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e7d0: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
e7e0: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
e7f0: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
e800: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
e810: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
e820: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
e830: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e840: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
e850: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
e860: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
e870: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
e880: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
e890: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
e8a0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
e8b0: 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73  */.  int wsFlags
e8c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e8d0: 49 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61  Index usages fla
e8e0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  gs */.  int *pbR
e8f0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
e900: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
e910: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
e920: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
e930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e950: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
e960: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e980: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
e990: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
e9a0: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
e9b0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
e9e0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
e9f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ea00: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
ea10: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
ea20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ea30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ea40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ea50: 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79  .  if( !pOrderBy
ea60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ea70: 66 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  f( wsFlags & WHE
ea80: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72  RE_COLUMN_IN ) r
ea90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
eaa0: 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  Idx->bUnordered 
eab0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
eac0: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
ead0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
eae0: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
eaf0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  /* Argument pIdx
eb00: 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
eb10: 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e  nt to a 'real' n
eb20: 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63  amed index struc
eb30: 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61  ture, .  ** or a
eb40: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
eb50: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  e allocated on t
eb60: 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74  he stack by best
eb70: 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a  BtreeIndex() to.
eb80: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74    ** represent t
eb90: 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74  he rowid index t
eba0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65  hat is part of e
ebb0: 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  very table.  */.
ebc0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
ebd0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e  zName || (pIdx->
ebe0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
ebf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
ec00: 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =-1) );..  /* Ma
ec10: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
ec20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ec30: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
ec40: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
ec50: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
ec60: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
ec70: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
ec80: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
ec90: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
eca0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
ecb0: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
ecc0: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
ecd0: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
ece0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
ecf0: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
ed00: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
ed10: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
ed20: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
ed30: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
ed40: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
ed50: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
ed60: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
ed70: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
ed80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
ed90: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
eda0: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
edb0: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
edc0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
edd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ede0: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
edf0: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
ee00: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
ee10: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
ee20: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
ee30: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
ee40: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
ee50: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
ee60: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
ee70: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
ee80: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
ee90: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
eea0: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
eeb0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
eec0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
eed0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
eee0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
eef0: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
ef00: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
ef10: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
ef20: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
ef30: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
ef40: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
ef50: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
ef60: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
ef70: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
ef80: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
ef90: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
efa0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
efb0: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
efc0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
efd0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
efe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
eff0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f000: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
f010: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
f020: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
f030: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
f040: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
f050: 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26  f( pIdx->zName &
f060: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
f070: 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
f080: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
f090: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
f0a0: 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
f0b0: 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
f0d0: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
f0e0: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
f0f0: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
f100: 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
f110: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
f120: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
f130: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
f140: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
f150: 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
f160: 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
f170: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
f180: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
f190: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
f1a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f1b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
f1c0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
f1d0: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
f1e0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
f1f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
f200: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
f210: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
f220: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
f230: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
f240: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
f250: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
f260: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
f270: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
f280: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
f290: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
f2a0: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
f2b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
f2c0: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
f2d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
f2e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f2f0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
f300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
f310: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
f320: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
f330: 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
f340: 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
f350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
f360: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
f370: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
f380: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
f390: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
f3a0: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
f3b0: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
f3c0: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
f3d0: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
f3e0: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
f3f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f410: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f420: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
f430: 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f  tOrder!=0 || iCo
f440: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  lumn==-1 );.    
f450: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73  assert( pTerm->s
f460: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
f470: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
f480: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
f490: 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( iSortOrder==0 
f4a0: 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31  || iSortOrder==1
f4b0: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
f4c0: 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64  Order = iSortOrd
f4d0: 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  er ^ pTerm->sort
f4e0: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
f4f0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
f500: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
f510: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
f520: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
f530: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
f540: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
f550: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
f560: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
f570: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f580: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
f590: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
f5a0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f5b0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
f5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
f5d0: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
f5e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
f5f0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
f600: 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  m++;.    if( iCo
f610: 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72  lumn<0 && !refer
f620: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
f630: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
f640: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
f650: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
f660: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
f670: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
f680: 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e  ey and everythin
f690: 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20  g matches.      
f6a0: 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f  ** so far and no
f6b0: 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
f6c0: 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  BY terms to the 
f6d0: 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20  right reference 
f6e0: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  other.      ** t
f6f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
f700: 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  n, then we are a
f710: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
f720: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
f730: 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73  d .      ** to s
f740: 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ort because the 
f750: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
f760: 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e  nique and so non
f770: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20  e of the other. 
f780: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
f790: 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69  will make any di
f7a0: 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  fference.      *
f7b0: 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72  /.      j = nTer
f7c0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
f7d0: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
f7e0: 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d  er!=0;.  if( j>=
f7f0: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  nTerm ){.    /* 
f800: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
f810: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f820: 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
f830: 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20  this index so.  
f840: 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20    ** this index 
f850: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
f860: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  sorting. */.    
f870: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f880: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
f890: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d  r!=OE_None && i=
f8a0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  =pIdx->nColumn. 
f8b0: 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
f8c0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
f8d0: 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26  NULL)==0.      &
f8e0: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
f8f0: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
f900: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
f910: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  base) ){.    /* 
f920: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69  All terms of thi
f930: 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f  s index match so
f940: 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  me prefix of the
f950: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f960: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
f970: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20  index is UNIQUE 
f980: 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20  and no terms on 
f990: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
f9a0: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
f9b0: 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65  clause reference
f9c0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
f9d0: 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69   a join.  If thi
f9e0: 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68  s is all true th
f9f0: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  en.    ** the or
fa00: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73  der by clause is
fa10: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e   superfluous.  N
fa20: 6f 74 20 74 68 61 74 20 69 66 20 74 68 65 20 6d  ot that if the m
fa30: 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63  atching.    ** c
fa40: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e  ondition is IS N
fa50: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
fa60: 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ult is not neces
fa70: 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20  sarily unique.  
fa80: 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55    ** even on a U
fa90: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20  NIQUE index, so 
faa0: 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63  disallow those c
fab0: 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ases. */.    ret
fac0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
fad0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fae0: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
faf0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
fb00: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
fb10: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
fb20: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
fb30: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
fb40: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
fb50: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
fb60: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
fb70: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
fb80: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
fb90: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
fba0: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
fbb0: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
fbc0: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
fbd0: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
fbe0: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
fbf0: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
fc00: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
fc10: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
fc20: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
fc30: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
fc40: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
fc50: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
fc60: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
fc70: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
fc80: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
fc90: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
fca0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
fcb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
fcc0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fcd0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
fce0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
fcf0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
fd00: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
fd10: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
fd20: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
fd30: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
fd40: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
fd50: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
fd60: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
fd70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
fd80: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
fd90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
fda0: 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
fdb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
fdc0: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
fdd0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
fde0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
fdf0: 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
fe00: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
fe10: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
fe20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
fe30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fe40: 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
fe50: 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
fe60: 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
fe70: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
fe80: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
fe90: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
fea0: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
feb0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
fec0: 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
fed0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
fee0: 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
fef0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
ff00: 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
ff10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
ff20: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
ff30: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
ff40: 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
ff50: 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
ff60: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
ff70: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
ff80: 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
ff90: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
ffa0: 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
ffb0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
ffc0: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
ffd0: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
ffe0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
fff0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10000 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
10010 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
10020 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
10030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10040 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10050 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
10060 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
10070 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
10080 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
10090 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
100a0 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
100b0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
100c0 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
100d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
100e0 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
100f0 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
10100 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
10110 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
10120 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
10130 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
10140 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
10150 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
10160 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
10170 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
10180 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
10190 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
101a0 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
101b0 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
101c0 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
101d0 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
101e0 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
101f0 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
10200 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64  ./* .** Required
10210 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64   because bestInd
10220 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ex() is called b
10230 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  y bestOrClauseIn
10240 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63  dex() .*/.static
10250 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
10260 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65  .    Parse*, Whe
10270 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63  reClause*, struc
10280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
10290 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69  .    Bitmask, Bi
102a0 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a  tmask, ExprList*
102b0 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a  , WhereCost*);..
102c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
102d0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
102e0 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20  ind an scanning 
102f0 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61  strategy that ca
10300 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  n be used .** to
10310 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52   optimize an 'OR
10320 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ' expression tha
10330 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57  t is part of a W
10340 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a  HERE clause. .**
10350 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73  .** The table as
10360 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52  sociated with FR
10370 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
10380 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65  Src may be eithe
10390 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42  r a.** regular B
103a0 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61  -Tree table or a
103b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
103d0 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
103e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
103f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10400 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10410 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
10420 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10440 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10450 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10460 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10470 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10480 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
10490 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
104a0 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
104b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
104c0 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
104d0 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
104e0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
104f0 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
10500 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
10510 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
10520 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
10530 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
10540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10560 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
10570 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
10580 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
10590 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
105a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
105b0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
105c0 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74  TION.  const int
105d0 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
105e0 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
105f0 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
10600 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
10610 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  ed */.  const Bi
10620 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
10630 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10640 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
10650 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
10660 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10670 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10680 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10690 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
106a0 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
106b0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
106c0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
106d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
106e0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
106f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10700 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61  ..  /* No OR-cla
10710 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
10720 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
10730 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
10740 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
10750 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20  s.  ** are used 
10760 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
10770 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72  otIndexed || pSr
10780 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  c->pIndex!=0 ){.
10790 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
107a0 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65  .  /* Search the
107b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
107c0 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65  rms for a usable
107d0 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a   WO_OR term. */.
107e0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
107f0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
10800 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
10810 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
10820 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
10830 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72    && ((pTerm->pr
10840 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53  ereqAll & ~maskS
10850 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  rc) & notReady)=
10860 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
10870 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
10880 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
10890 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  c)!=0 .    ){.  
108a0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
108b0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
108c0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
108d0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
108e0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
108f0 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
10900 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
10910 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
10920 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
10930 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57     int flags = W
10940 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
10950 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
10960 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  al = 0;.      do
10970 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  uble nRow = 0;. 
10980 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65       Bitmask use
10990 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f  d = 0;..      fo
109a0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
109b0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
109c0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
109d0 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
109e0 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20  ost sTermCost;. 
109f0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
10a00 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
10a10 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
10a20 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
10a30 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
10a40 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
10a50 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
10a60 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
10a70 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
10a80 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
10a90 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
10aa0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
10ab0 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d  Clause *pAndWC =
10ac0 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
10ad0 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
10ae0 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70       bestIndex(p
10af0 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70  Parse, pAndWC, p
10b00 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
10b10 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65  otValid, 0, &sTe
10b20 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rmCost);.       
10b30 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
10b40 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
10b50 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
10b60 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
10b70 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
10b80 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20  tempWC.pParse = 
10b90 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pWC->pParse;.   
10ba0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4d         tempWC.pM
10bb0 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
10bc0 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20 20  askSet;.        
10bd0 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
10be0 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
10bf0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
10c00 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  rm;.          te
10c10 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
10c20 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10c30 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65 6d  dex(pParse, &tem
10c40 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
10c50 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30  ady, notValid, 0
10c60 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
10c70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10c80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
10c90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10ca0 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54      rTotal += sT
10cb0 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  ermCost.rCost;. 
10cc0 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
10cd0 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52  TermCost.plan.nR
10ce0 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
10cf0 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75 73   |= sTermCost.us
10d00 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
10d10 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72  rTotal>=pCost->r
10d20 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  Cost ) break;.  
10d30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10d40 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
10d50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
10d60 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61  increase the sca
10d70 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e  n cost to accoun
10d80 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  t .      ** for 
10d90 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
10da0 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sort. */.      i
10db0 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  f( pOrderBy!=0 )
10dc0 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  {.        WHERET
10dd0 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
10de0 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20  ng increases OR 
10df0 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e 39  cost %.9g to %.9
10e00 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
10e10 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c            rTotal
10e20 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73  , rTotal+nRow*es
10e30 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20 20  tLog(nRow)));.  
10e40 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
10e50 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
10e60 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10e70 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74    /* If the cost
10e80 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69   of scanning usi
10e90 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20  ng this OR term 
10ea0 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  for optimization
10eb0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73   is.      ** les
10ec0 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
10ed0 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69  nt cost stored i
10ee0 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65  n pCost, replace
10ef0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
10f00 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e      ** of pCost.
10f10 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10f20 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69  RACE(("... multi
10f30 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25  -index OR cost=%
10f40 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22  .9g nrow=%.9g\n"
10f50 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29  , rTotal, nRow))
10f60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74  ;.      if( rTot
10f70 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  al<pCost->rCost 
10f80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  ){.        pCost
10f90 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c  ->rCost = rTotal
10fa0 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
10fb0 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20  >used = used;.  
10fc0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
10fd0 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  n.nRow = nRow;. 
10fe0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
10ff0 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61  an.wsFlags = fla
11000 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  gs;.        pCos
11010 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  t->plan.u.pTerm 
11020 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
11030 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11040 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11050 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
11060 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
11070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11080 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11090 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
110a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
110b0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
110c0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
110d0 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
110e0 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
110f0 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
11100 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
11110 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
11120 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
11130 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
11140 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
11150 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11170 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11180 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11190 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
111a0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
111b0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
111c0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
111d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
111e0 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
111f0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
11200 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
11210 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
11220 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
11230 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
11240 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
11250 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
11260 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
11270 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72 65  ator!=WO_EQ ) re
11280 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
11290 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
112a0 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
112b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
112c0 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  ff = pSrc->pTab-
112d0 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c  >aCol[pTerm->u.l
112e0 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  eftColumn].affin
112f0 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ity;.  if( !sqli
11300 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
11310 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  Ok(pTerm->pExpr,
11320 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30   aff) ) return 0
11330 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
11340 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
11350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11360 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
11370 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 70  * If the query p
11380 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70 65  lan for pSrc spe
11390 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74 20  cified in pCost 
113a0 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  is a full table 
113b0 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64 65  scan.** and inde
113c0 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20 28  xing is allows (
113d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e  if there is no N
113e0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
113f0 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f 73  e) and it.** pos
11400 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72 75  sible to constru
11410 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  ct a transient i
11420 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64 20  ndex that would 
11430 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a 2a  perform better.*
11440 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61  * than a full ta
11450 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77 68  ble scan even wh
11460 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 63  en the cost of c
11470 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
11480 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b 65  index.** is take
11490 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20  n into account, 
114a0 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20 71  then alter the q
114b0 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73 65  uery plan to use
114c0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e   the.** transien
114d0 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
114e0 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74 6f  ic void bestAuto
114f0 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
11500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11520 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
11530 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11540 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
11550 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11560 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11570 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11580 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
11590 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
115a0 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
115b0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
115d0 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
115e0 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
115f0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ble */.  WhereCo
11600 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
11610 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
11620 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
11630 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e 54  /.){.  double nT
11640 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20  ableRow;        
11650 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68     /* Rows in th
11660 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a 2f  e input table */
11670 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20  .  double logN; 
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11690 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
116a0 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
116b0 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
116c0 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
116d0 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
116e0 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
116f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
11700 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
11710 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
11720 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11730 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11740 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11750 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11760 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
11770 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
11780 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11790 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
117a0 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  xed */..  if( pP
117b0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
117c0 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  <=(double)1 ){. 
117d0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
117e0 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64  o point in build
117f0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
11800 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e   index for a sin
11810 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  gle scan */.    
11820 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
11830 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
11840 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
11850 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20  toIndex)==0 ){. 
11860 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
11870 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61  indices are disa
11880 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  bled at run-time
11890 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
118a0 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 73 74    }.  if( (pCost
118b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
118c0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
118d0 43 41 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  CAN)!=0 ){.    /
118e0 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68 61 76  * We already hav
118f0 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69  e some kind of i
11900 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f 72 20  ndex in use for 
11910 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20  this query. */. 
11920 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
11930 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
11940 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  dexed ){.    /* 
11950 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  The NOT INDEXED 
11960 63 6c 61 75 73 65 20 61 70 70 65 61 72 73 20 69  clause appears i
11970 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20  n the SQL. */.  
11980 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
11990 69 66 28 20 70 53 72 63 2d 3e 69 73 43 6f 72 72  if( pSrc->isCorr
119a0 65 6c 61 74 65 64 20 29 7b 0a 20 20 20 20 2f 2a  elated ){.    /*
119b0 20 54 68 65 20 73 6f 75 72 63 65 20 69 73 20 61   The source is a
119c0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
119d0 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e 74 20  query. No point 
119e0 69 6e 20 69 6e 64 65 78 69 6e 67 20 69 74 2e 20  in indexing it. 
119f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11a00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
11a10 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
11a20 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20 29 3b   >= (double)1 );
11a30 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
11a40 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65  ->pTab;.  nTable
11a50 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52  Row = pTable->nR
11a60 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20  owEst;.  logN = 
11a70 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  estLog(nTableRow
11a80 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49 64 78  );.  costTempIdx
11a90 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c   = 2*logN*(nTabl
11aa0 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75  eRow/pParse->nQu
11ab0 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20  eryLoop + 1);.  
11ac0 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64 78 3e  if( costTempIdx>
11ad0 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
11ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74  .    /* The cost
11af0 20 6f 66 20 63 72 65 61 74 69 6e 67 20 74 68 65   of creating the
11b00 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
11b10 20 77 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65   would be greate
11b20 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f  r than.    ** do
11b30 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62  ing the full tab
11b40 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72  le scan */.    r
11b50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
11b60 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20   Search for any 
11b70 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
11b80 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57  son term */.  pW
11b90 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
11ba0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f  WC->nTerm];.  fo
11bb0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
11bc0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
11bd0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
11be0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
11bf0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
11c00 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
11c10 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61    WHERETRACE(("a
11c20 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65  uto-index reduce
11c30 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66  s cost from %.1f
11c40 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20   to %.1f\n",.   
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c 20 63   pCost->rCost, c
11c70 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20  ostTempIdx));.  
11c80 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
11c90 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a   = costTempIdx;.
11ca0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
11cb0 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20  n.nRow = logN + 
11cc0 31 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  1;.      pCost->
11cd0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57  plan.wsFlags = W
11ce0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  HERE_TEMP_INDEX;
11cf0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
11d00 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ed = pTerm->prer
11d10 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62  eqRight;.      b
11d20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11d30 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
11d40 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
11d50 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29 20 20  dex(A,B,C,D,E)  
11d60 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64  /* no-op */.#end
11d70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11d80 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11d90 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  X */...#ifndef S
11da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11db0 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11dc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11dd0 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
11de0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
11df0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
11e00 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
11e10 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
11e20 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
11e30 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
11e40 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
11e50 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
11e60 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11e80 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
11e90 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
11ea0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11ec0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11ed0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
11ee0 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
11ef0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11f00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
11f10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11f20 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
11f30 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
11f40 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
11f50 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
11f60 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
11f70 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
11f80 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
11f90 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
11fa0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
11fb0 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
11fc0 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
11fd0 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
11fe0 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt nColumn;     
11ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12000 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
12010 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
12020 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
12030 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
12050 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
12060 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12070 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
12080 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
12090 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
120a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  [] */.  int nByt
120b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
120c0 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d      /* Byte of m
120d0 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72  emory needed for
120e0 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
120f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12100 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12110 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
12120 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
12130 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
12160 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
12170 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
12180 6e 74 20 72 65 67 49 73 49 6e 69 74 3b 20 20 20  nt regIsInit;   
12190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
121a0 67 69 73 74 65 72 20 73 65 74 20 62 79 20 69 6e  gister set by in
121b0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
121c0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
121f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
12200 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
12210 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
12220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12230 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
12240 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
12250 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
12260 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
12270 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
12280 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
12290 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122b0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
122c0 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
122d0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
122f0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12300 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
12310 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
12340 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12370 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
12380 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
12390 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
123a0 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
123b0 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
123c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
123d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
123e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
123f0 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
12400 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
12410 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
12420 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
12430 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
12440 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
12450 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
12460 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
12470 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
12480 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  olumns */..  /* 
12490 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
124a0 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
124b0 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
124c0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
124d0 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
124e0 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
124f0 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
12500 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
12510 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
12520 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
12530 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
12540 20 72 65 67 49 73 49 6e 69 74 20 3d 20 2b 2b 70   regIsInit = ++p
12550 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61  Parse->nMem;.  a
12560 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
12570 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12580 50 5f 49 66 2c 20 72 65 67 49 73 49 6e 69 74 29  P_If, regIsInit)
12590 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
125a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
125b0 67 65 72 2c 20 31 2c 20 72 65 67 49 73 49 6e 69  ger, 1, regIsIni
125c0 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  t);..  /* Count 
125d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
125e0 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
125f0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
12600 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
12610 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
12620 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
12630 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75  aints */.  nColu
12640 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  mn = 0;.  pTable
12650 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
12660 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
12670 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
12680 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
12690 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
126a0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
126b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
126c0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
126d0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
126e0 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
126f0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
12700 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12710 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
12720 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
12730 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29  BMS ? ((Bitmask)
12740 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28  1)<<(BMS-1) : ((
12750 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c  Bitmask)1)<<iCol
12760 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12770 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
12780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
12790 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
127a0 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
127b0 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
127c0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b          nColumn+
127d0 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  +;.        idxCo
127e0 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
127f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12800 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
12810 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  >0 );.  pLevel->
12820 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75  plan.nEq = nColu
12830 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  mn;..  /* Count 
12840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
12850 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
12860 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
12870 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
12880 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
12890 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
128a0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
128b0 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
128c0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
128d0 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
128e0 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
128f0 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
12900 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
12910 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
12920 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
12930 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
12940 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
12950 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
12960 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
12970 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
12980 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
12990 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
129a0 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
129b0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
129c0 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
129d0 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
129e0 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
129f0 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
12a00 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
12a10 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
12a20 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s | (((Bitmask)1
12a30 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20  )<<(BMS-1)));.  
12a40 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62  mxBitCol = (pTab
12a50 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d  le->nCol >= BMS-
12a60 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61  1) ? BMS-1 : pTa
12a70 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73  ble->nCol;.  tes
12a80 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
12a90 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
12aa0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
12ab0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b  ->nCol==BMS-2 );
12ac0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
12ad0 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
12ae0 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
12af0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
12b00 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b  <i) ) nColumn++;
12b10 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
12b20 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69  >colUsed & (((Bi
12b30 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
12b40 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  )) ){.    nColum
12b50 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  n += pTable->nCo
12b60 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d  l - BMS + 1;.  }
12b70 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  .  pLevel->plan.
12b80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
12b90 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
12ba0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f  RE_IDX_ONLY | WO
12bb0 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  _EQ;..  /* Const
12bc0 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
12bd0 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
12be0 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
12bf0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
12c00 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65  (Index);.  nByte
12c10 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
12c20 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20  of(int);     /* 
12c30 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a  Index.aiColumn *
12c40 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f  /.  nByte += nCo
12c50 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  lumn*sizeof(char
12c60 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  *);   /* Index.a
12c70 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65  zColl */.  nByte
12c80 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20   += nColumn;    
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ca0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
12cb0 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
12cc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
12cd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79  (pParse->db, nBy
12ce0 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  te);.  if( pIdx=
12cf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
12d00 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
12d10 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  dx = pIdx;.  pId
12d20 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
12d30 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
12d40 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
12d50 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
12d60 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
12d70 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
12d80 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
12d90 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
12da0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
12db0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
12dc0 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
12dd0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
12de0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
12df0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
12e00 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
12e10 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
12e20 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
12e30 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12e40 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
12e50 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
12e60 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
12e70 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
12e80 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
12e90 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
12ea0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
12eb0 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
12ec0 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
12ed0 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
12ee0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
12ef0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
12f00 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
12f10 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
12f20 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
12f30 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
12f40 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
12f50 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
12f60 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
12f70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
12f80 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
12f90 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
12fa0 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
12fb0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
12fc0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
12fd0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
12fe0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
12ff0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
13000 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
13010 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13020 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
13030 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20  Level->plan.nEq 
13040 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
13050 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
13060 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
13070 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
13080 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
13090 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
130a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
130b0 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
130c0 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
130d0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
130e0 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  <i) ){.      pId
130f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13100 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
13110 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
13120 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
13130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13140 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13150 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
13160 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
13170 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
13180 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
13190 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
131a0 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
131b0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
131c0 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
131d0 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
131e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
131f0 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a   n==nColumn );..
13200 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13210 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
13220 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20  */.  pKeyinfo = 
13230 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
13240 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
13250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
13260 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
13270 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13280 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
13290 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
132a0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f  el->iIdxCur, nCo
132b0 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20  lumn+1, 0,.     
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
132d0 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20  char*)pKeyinfo, 
132e0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
132f0 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  FF);.  VdbeComme
13300 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
13310 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29   pTable->zName))
13320 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  ;..  /* Fill the
13330 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13340 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f   with content */
13350 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
13360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13370 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65  , OP_Rewind, pLe
13380 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
13390 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
133a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
133b0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
133c0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
133d0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
133e0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
133f0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
13400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13410 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
13420 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
13430 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
13440 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13450 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
13460 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
13470 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
13490 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
134a0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
134b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
134c0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
134d0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
134e0 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
134f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13500 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
13510 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13520 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13530 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
13540 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
13550 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
13560 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
13570 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13580 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
13590 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
135a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
135b0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
135c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
135d0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
135e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
135f0 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
13600 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13610 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
13620 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
13630 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13640 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13650 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
13660 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
13670 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
13680 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
13690 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
136a0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
136b0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
136c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
136d0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
136e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
136f0 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20   .  WhereClause 
13700 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
13710 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13720 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
13730 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
13740 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
13750 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
13760 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13770 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
13780 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
13790 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
137a0 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
137b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
137c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
137d0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
137e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
137f0 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
13800 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
13810 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
13820 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  o;..  WHERETRACE
13830 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
13840 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
13850 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  ...\n", pSrc->pT
13860 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
13870 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
13880 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
13890 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
138a0 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
138b0 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
138c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
138d0 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
138e0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
138f0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
13900 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
13910 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
13920 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
13930 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
13940 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
13950 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
13960 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  r&(pTerm->eOpera
13970 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  tor-1))==0 );.  
13980 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13990 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
139a0 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
139b0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
139c0 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
139d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
139e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
139f0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IN|WO_ISNULL)
13a00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13a10 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
13a20 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
13a30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13a40 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
13a50 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
13a60 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
13a70 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
13a80 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13a90 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
13aa0 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
13ab0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
13ac0 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
13ad0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
13ae0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13af0 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
13b00 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
13b10 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13b20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
13b30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
13b40 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13b50 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
13b60 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
13b70 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
13b80 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
13b90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
13ba0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
13bb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13bc0 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79   if( i==pOrderBy
13bd0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
13be0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
13bf0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
13c00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
13c10 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
13c20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13c30 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49  ucture.  */.  pI
13c40 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  dxInfo = sqlite3
13c50 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
13c60 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
13c70 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20  *pIdxInfo).     
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
13ca0 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
13cb0 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
13cc0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
13ce0 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
13cf0 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
13d00 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
13d10 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13d20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d30 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
13d40 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75  y");.    /* (dou
13d50 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
13d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13d70 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
13d80 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
13d90 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
13da0 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
13db0 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
13dc0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13dd0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
13de0 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
13df0 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
13e00 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
13e10 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
13e20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
13e30 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
13e40 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
13e50 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
13e60 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
13e70 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
13e80 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
13e90 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
13ea0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13eb0 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
13ec0 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
13ed0 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
13ee0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
13ef0 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
13f00 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
13f10 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
13f20 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13f30 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
13f40 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
13f50 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
13f60 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13f70 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
13f80 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
13f90 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
13fa0 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
13fb0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
13fc0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
13fd0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13fe0 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
13ff0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
14000 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
14010 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
14020 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
14030 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
14040 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14050 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
14060 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
14070 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
140d0 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
140e0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
140f0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
14100 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
14110 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
14120 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
14130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14140 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
14150 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
14160 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
14170 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14180 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14190 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
141a0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
141b0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
141c0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
141d0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
141e0 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
141f0 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
14200 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
14210 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
14220 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
14230 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
14240 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
14250 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
14260 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14270 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
14280 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
14290 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d  ].op = (u8)pTerm
142a0 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20  ->eOperator;.   
142b0 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
142c0 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
142d0 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
142e0 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
142f0 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
14300 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
14310 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14320 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
14330 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
14340 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
14350 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
14360 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
14370 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
14380 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14390 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
143a0 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
143b0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
143c0 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
143d0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
143e0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
143f0 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
14400 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
14410 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14420 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
14430 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
14440 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
14450 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
14460 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14470 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
14480 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
14490 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
144a0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
144b0 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
144c0 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
144d0 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
144e0 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
144f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
14500 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
14510 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
14520 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14530 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
14540 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
14550 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
14560 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
14570 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
14580 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
14590 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rder;.  }..  ret
145a0 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a  urn pIdxInfo;.}.
145b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
145c0 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
145d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
145e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
145f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14600 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65  .** must represe
14610 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  nt a virtual tab
14620 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
14630 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42  n invokes the xB
14640 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65  estIndex().** me
14650 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
14660 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74  ual table with t
14670 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14680 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61  _info pointer pa
14690 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61  ssed.** as the a
146a0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
146b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
146c0 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
146d0 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
146e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
146f0 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
14700 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
14710 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
14720 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
14730 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
14740 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
14750 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14760 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
14770 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
14780 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
14790 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
147a0 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
147b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
147c0 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
147d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
147e0 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
147f0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
14800 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
14810 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
14820 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
14830 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
14840 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
14850 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
14860 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14870 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
14880 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
14890 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
148a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
148b0 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69  ->pVtab;.  int i
148c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57  ;.  int rc;..  W
148d0 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73  HERETRACE(("xBes
148e0 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22  tIndex for %s\n"
148f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
14900 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
14910 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
14920 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
14930 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
14940 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
14950 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
14960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
14980 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
14990 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
149a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
149b0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
149c0 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
149d0 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
149e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
149f0 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
14a00 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
14a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
14a20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14a30 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
14a40 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
14a50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14a60 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
14a70 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
14a80 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
14a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14aa0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
14ab0 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
14ac0 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
14ad0 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
14ae0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
14af0 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
14b00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14b10 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
14b20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
14b30 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
14b40 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
14b50 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
14b60 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
14b70 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
14b80 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nErr;.}.../*.**
14b90 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73   Compute the bes
14ba0 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69  t index for a vi
14bb0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
14bc0 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  ** The best inde
14bd0 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79  x is computed by
14be0 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
14bf0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14c00 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d  rtual.** table m
14c10 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  odule.  This rou
14c20 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a  tine is really j
14c30 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68  ust a wrapper th
14c40 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68  at sets up.** th
14c50 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14c60 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
14c70 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
14c80 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a  ommunicate with.
14c90 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  ** xBestIndex..*
14ca0 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20  *.** In a join, 
14cb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
14cc0 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c  ht be called mul
14cd0 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20  tiple times for 
14ce0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74  the.** same virt
14cf0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
14d00 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14d10 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14d20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69  created.** and i
14d30 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68  nitialized on th
14d40 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
14d50 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  on and reused on
14d60 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
14d70 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20  ** invocations. 
14d80 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14d90 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14da0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
14db0 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  hen.** code is g
14dc0 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65  enerated to acce
14dd0 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ss the virtual t
14de0 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65  able.  The where
14df0 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a  InfoDelete() .**
14e00 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63   routine takes c
14e10 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74  are of freeing t
14e20 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14e30 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
14e40 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f  after.** everybo
14e50 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  dy has finished 
14e60 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  with it..*/.stat
14e70 69 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74  ic void bestVirt
14e80 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ualIndex(.  Pars
14e90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14eb0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14ec0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
14ed0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
14ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
14ef0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
14f00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14f10 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
14f20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
14f30 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
14f40 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
14f50 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
14f60 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
14f70 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61  of cursors not a
14f80 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64  vailable for ind
14f90 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
14fa0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
14fb0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14fc0 72 73 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72  rs not valid for
14fd0 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
14fe0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
14ff0 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
15000 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62    /* The order b
15010 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  y clause */.  Wh
15020 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20  ereCost *pCost, 
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15040 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
15050 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c  ry plan */.  sql
15060 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15070 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20  **ppIdxInfo  /* 
15080 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f  Index informatio
15090 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65 73  n passed to xBes
150a0 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54  tIndex */.){.  T
150b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72  able *pTab = pSr
150c0 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  c->pTab;.  sqlit
150d0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
150e0 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
150f0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
15100 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
15110 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
15120 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
15130 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
15140 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
15150 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
15160 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72   i, j;.  int nOr
15170 64 65 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20  derBy;.  double 
15180 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  rCost;..  /* Mak
15190 65 20 73 75 72 65 20 77 73 46 6c 61 67 73 20 69  e sure wsFlags i
151a0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
151b0 20 73 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65   some sane value
151c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
151d0 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63  the .  ** malloc
151e0 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65   in allocateInde
151f0 78 49 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e  xInfo() fails an
15200 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
15210 72 65 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a  returns leaving.
15220 20 20 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20    ** wsFlags in 
15230 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
15240 20 73 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c   state, the call
15250 65 72 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e  er may behave un
15260 70 72 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a  predictably..  *
15270 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74  /.  memset(pCost
15280 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
15290 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  st));.  pCost->p
152a0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
152b0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
152c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
152d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
152e0 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  o structure has 
152f0 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
15300 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  sly.  ** allocat
15310 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ed and initializ
15320 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ed, then allocat
15330 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
15340 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
15350 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64  pIdxInfo = *ppId
15360 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
15370 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
15380 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  *ppIdxInfo = pId
15390 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
153a0 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
153b0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 4f 72  , pWC, pSrc, pOr
153c0 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66  derBy);.  }.  if
153d0 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
153e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
153f0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
15400 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  oint, the sqlite
15410 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
15420 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78  ucture that pIdx
15430 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  Info points.  **
15440 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65   to will have be
15450 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  en initialized, 
15460 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68  either during th
15470 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
15480 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72  tion or.  ** dur
15490 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69  ing some prior i
154a0 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20  nvocation.  Now 
154b0 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  we just have to 
154c0 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20  customize the.  
154d0 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49  ** details of pI
154e0 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63  dxInfo for the c
154f0 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
15500 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f  n and pass it to
15510 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  .  ** xBestIndex
15520 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ..  */..  /* The
15530 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73   module name mus
15540 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c  t be defined. Al
15550 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e  so, by this poin
15560 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a  t there must.  *
15570 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  * be a pointer t
15580 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
15590 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  b structure. Oth
155a0 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69  erwise.  ** sqli
155b0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
155c0 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61  Names() would ha
155d0 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65  ve picked up the
155e0 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20   error. .  */.  
155f0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a  assert( pTab->az
15600 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61  ModuleArg && pTa
15610 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
15620 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ] );.  assert( s
15630 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
15640 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
15650 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ) );..  /* Set t
15660 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  he aConstraint[]
15670 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61  .usable fields a
15680 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
15690 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76  l .  ** output v
156a0 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f  ariables to zero
156b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e  ..  **.  ** aCon
156c0 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
156d0 20 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e   is true for con
156e0 73 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74  straints where t
156f0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20  he right-hand.  
15700 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73  ** side contains
15710 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73   only references
15720 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68   to tables to th
15730 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75  e left of the cu
15740 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65  rrent.  ** table
15750 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15760 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72  s, if the constr
15770 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
15780 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
15790 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
157a0 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a  = expr.  **.  **
157b0 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c   and we are eval
157c0 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74  uating a join, t
157d0 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
157e0 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20  nt on column is 
157f0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64  .  ** only valid
15800 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72   if all tables r
15810 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70  eferenced in exp
15820 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c  r occur to the l
15830 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  eft.  ** of the 
15840 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
15850 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20   column..  **.  
15860 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69  ** The aConstrai
15870 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  nts[] array cont
15880 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
15890 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
158a0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  .  ** on the cur
158b0 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61  rent table.  Tha
158c0 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61  t way we only ha
158d0 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74  ve to compute it
158e0 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20   once.  ** even 
158f0 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20  though we might 
15900 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20  try to pick the 
15910 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69  best index multi
15920 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20  ple times..  ** 
15930 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74  For each attempt
15940 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69   at picking an i
15950 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20  ndex, the order 
15960 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
15970 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74  .  ** join might
15980 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f   be different so
15990 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f   we have to reco
159a0 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65  mpute the usable
159b0 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20   flag.  ** each 
159c0 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  time..  */.  pId
159d0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
159e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
159f0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
15a00 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15a10 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70  nt;.  pUsage = p
15a20 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
15a30 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72  aintUsage;.  for
15a40 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
15a50 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15a60 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
15a70 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e  .    j = pIdxCon
15a80 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
15a90 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
15aa0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78  ->a[j];.    pIdx
15ab0 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
15ac0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15ad0 68 74 26 6e 6f 74 52 65 61 64 79 29 20 3f 20 30  ht&notReady) ? 0
15ae0 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   : 1;.  }.  mems
15af0 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
15b00 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
15b10 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
15b20 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49  raint);.  if( pI
15b30 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
15b40 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
15b50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
15b60 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
15b70 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e    }.  pIdxInfo->
15b80 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
15b90 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
15ba0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
15bb0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
15bc0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
15bd0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
15be0 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f  d = 0;.  /* ((do
15bf0 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20  uble)2) In case 
15c00 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
15c10 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
15c20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   */.  pIdxInfo->
15c30 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
15c40 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
15c50 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20   ((double)2);.  
15c60 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 49  nOrderBy = pIdxI
15c70 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20  nfo->nOrderBy;. 
15c80 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 29   if( !pOrderBy )
15c90 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
15ca0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15cb0 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73  }..  if( vtabBes
15cc0 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
15cd0 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29  Tab, pIdxInfo) )
15ce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
15cf0 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  }..  pIdxCons = 
15d00 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
15d10 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
15d20 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
15d30 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
15d40 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
15d50 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
15d60 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55  i++){.    if( pU
15d70 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
15d80 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  x>0 ){.      pCo
15d90 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d  st->used |= pWC-
15da0 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69  >a[pIdxCons[i].i
15db0 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72  TermOffset].prer
15dc0 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  eqRight;.    }. 
15dd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
15de0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
15df0 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
15e00 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75 61   selected virtua
15e10 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20  l table index.  
15e20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  ** does not sati
15e30 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65  sfy it, increase
15e40 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
15e50 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c   scan accordingl
15e60 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74  y. This.  ** mat
15e70 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73 73  ches the process
15e80 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74  ing for non-virt
15e90 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65  ual tables in be
15ea0 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a  stBtreeIndex()..
15eb0 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70    */.  rCost = p
15ec0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
15ed0 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f  edCost;.  if( pO
15ee0 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
15ef0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
15f00 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
15f10 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
15f20 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
15f30 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
15f40 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
15f50 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
15f60 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
15f70 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
15f80 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
15f90 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
15fa0 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
15fb0 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
15fc0 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
15fd0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
15fe0 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
15ff0 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
16000 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
16010 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
16020 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16030 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
16040 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16050 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
16060 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
16070 73 74 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  st ){.    pCost-
16080 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45  >rCost = (SQLITE
16090 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
160a0 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e)2));.  }else{.
160b0 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
160c0 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20   = rCost;.  }.  
160d0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56  pCost->plan.u.pV
160e0 74 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66  tabIdx = pIdxInf
160f0 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  o;.  if( pIdxInf
16100 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
16110 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  ed ){.    pCost-
16120 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
16130 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
16140 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61    }.  pCost->pla
16150 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64  n.nEq = 0;.  pId
16160 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
16170 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = nOrderBy;..  /
16180 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
16190 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 61  more efficient a
161a0 63 63 65 73 73 20 70 61 74 74 65 72 6e 20 62 79  ccess pattern by
161b0 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   using multiple 
161c0 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20  indexes.  ** to 
161d0 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65  optimize an OR e
161e0 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
161f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
16200 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f  e. .  */.  bestO
16210 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61  rClauseIndex(pPa
16220 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
16230 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c  notReady, notVal
16240 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  id, pOrderBy, pC
16250 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ost);.}.#endif /
16260 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
16270 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
16280 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
16290 64 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  dx is a pointer 
162a0 74 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  to an index stru
162b0 63 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61  cture that has a
162c0 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 70 49  n array of.** pI
162d0 64 78 2d 3e 73 61 6d 70 6c 65 2e 6e 20 28 68 65  dx->sample.n (he
162e0 72 65 61 66 74 65 72 20 22 53 22 29 20 65 76 65  reafter "S") eve
162f0 6e 6c 79 20 73 70 61 63 65 64 20 73 61 6d 70 6c  nly spaced sampl
16300 65 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  es of the first 
16310 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d  indexed.** colum
16320 6e 20 73 74 6f 72 65 64 20 69 6e 20 49 6e 64 65  n stored in Inde
16330 78 2e 73 61 6d 70 6c 65 2e 20 54 68 65 73 65 20  x.sample. These 
16340 73 61 6d 70 6c 65 73 20 64 69 76 69 64 65 20 74  samples divide t
16350 68 65 20 64 6f 6d 61 69 6e 20 6f 66 20 76 61 6c  he domain of val
16360 75 65 73 0a 2a 2a 20 73 74 6f 72 65 64 20 74 68  ues.** stored th
16370 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 53 2b 31  e index into S+1
16380 20 72 65 67 69 6f 6e 73 2e 20 20 52 65 67 69 6f   regions.  Regio
16390 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  n 0 contains all
163a0 20 76 61 6c 75 65 73 20 6c 65 73 73 20 74 68 61   values less tha
163b0 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 73  n.** the first s
163c0 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67  ample value. Reg
163d0 69 6f 6e 20 31 20 63 6f 6e 74 61 69 6e 73 20 76  ion 1 contains v
163e0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 74 68  alues between th
163f0 65 20 66 69 72 73 74 20 61 6e 64 0a 2a 2a 20 73  e first and.** s
16400 65 63 6f 6e 64 20 73 61 6d 70 6c 65 73 2e 20 20  econd samples.  
16410 52 65 67 69 6f 6e 20 32 20 63 6f 6e 74 61 69 6e  Region 2 contain
16420 73 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  s values between
16430 20 73 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   samples 2 and 3
16440 2e 20 20 41 6e 64 20 73 6f 0a 2a 2a 20 6f 6e 2e  .  And so.** on.
16450 20 20 52 65 67 69 6f 6e 20 53 20 63 6f 6e 74 61    Region S conta
16460 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65  ins values large
16470 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20  r than the last 
16480 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  sample..**.** No
16490 74 65 20 74 68 61 74 20 73 61 6d 70 6c 65 73 20  te that samples 
164a0 61 72 65 20 63 6f 6d 70 75 74 65 64 20 61 73 20  are computed as 
164b0 62 65 69 6e 67 20 63 65 6e 74 65 72 65 64 20 6f  being centered o
164c0 6e 20 53 20 62 75 63 6b 65 74 73 20 77 68 65 72  n S buckets wher
164d0 65 20 65 61 63 68 0a 2a 2a 20 62 75 63 6b 65 74  e each.** bucket
164e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65   contains the ne
164f0 61 72 6c 79 20 73 61 6d 65 20 6e 75 6d 62 65 72  arly same number
16500 20 6f 66 20 72 6f 77 73 2e 20 20 54 68 69 73 20   of rows.  This 
16510 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 73 61  routine takes sa
16520 6d 70 6c 65 73 0a 2a 2a 20 74 6f 20 62 65 20 64  mples.** to be d
16530 69 76 69 64 65 72 73 20 62 65 74 77 65 65 6e 20  ividers between 
16540 72 65 67 69 6f 6e 73 2c 20 74 68 6f 75 67 68 2e  regions, though.
16550 20 20 48 65 6e 63 65 2c 20 72 65 67 69 6f 6e 20    Hence, region 
16560 30 20 61 6e 64 20 72 65 67 69 6f 6e 20 53 0a 2a  0 and region S.*
16570 2a 20 63 6f 6e 74 61 69 6e 20 68 61 6c 66 20 61  * contain half a
16580 73 20 6d 61 6e 79 20 72 6f 77 73 20 61 73 20 74  s many rows as t
16590 68 65 20 69 6e 74 65 72 69 6f 72 20 72 65 67 69  he interior regi
165a0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ons..**.** If th
165b0 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  e index contains
165c0 20 6d 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73   many duplicates
165d0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   of a single val
165e0 75 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  ue, then it is.*
165f0 2a 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  * possible that 
16600 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61 64 6a 61  two or more adja
16610 63 65 6e 74 20 73 61 6d 70 6c 65 73 20 63 61 6e  cent samples can
16620 20 68 6f 6c 64 20 74 68 65 20 73 61 6d 65 20 76   hold the same v
16630 61 6c 75 65 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  alue..** When th
16640 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
16650 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
16660 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f 64  sible region cod
16670 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
16680 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69 73   when roundUp is
16690 20 66 61 6c 73 65 20 61 6e 64 20 74 68 65 20 6c   false and the l
166a0 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
166b0 72 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20 72  region code is r
166c0 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e 20  eturned.** when 
166d0 72 6f 75 6e 64 55 70 20 69 73 20 74 72 75 65 2e  roundUp is true.
166e0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
166f0 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  sful, this funct
16700 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
16710 68 69 63 68 20 6f 66 20 74 68 65 20 72 65 67 69  hich of the regi
16720 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70 56  ons value .** pV
16730 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65 74 73  al lies in, sets
16740 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20 74 68   *piRegion to th
16750 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78 20 28  e region index (
16760 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
16770 30 0a 2a 2a 20 61 6e 64 20 53 2c 20 69 6e 63 6c  0.** and S, incl
16780 75 73 69 76 65 29 20 61 6e 64 20 72 65 74 75 72  usive) and retur
16790 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
167a0 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f   Or, if an OOM o
167b0 63 63 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76  ccurs while conv
167c0 65 72 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75  erting text valu
167d0 65 73 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64  es between encod
167e0 69 6e 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ings,.** SQLITE_
167f0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
16800 64 20 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20  d and *piRegion 
16810 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
16820 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16830 4e 41 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74  NABLE_STAT2.stat
16840 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
16850 65 52 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65  eRegion(.  Parse
16860 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
16870 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16880 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
16890 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168b0 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
168c0 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
168d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
168e0 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f   *pVal,        /
168f0 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69  * Value to consi
16900 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
16910 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
16920 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6c       /* Return l
16930 61 72 67 65 73 74 20 76 61 6c 69 64 20 72 65 67  argest valid reg
16940 69 6f 6e 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ion if true */. 
16950 20 69 6e 74 20 2a 70 69 52 65 67 69 6f 6e 2c 20   int *piRegion, 
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16970 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64  OUT: Region of d
16980 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76  omain in which v
16990 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a 20 20 75  alue lies */.  u
169a0 33 32 20 2a 70 6e 43 6f 70 79 20 20 20 20 20 20  32 *pnCopy      
169b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
169c0 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  T: Number of row
169d0 73 20 77 69 74 68 20 70 56 61 6c 2c 20 6f 72 20  s with pVal, or 
169e0 2d 31 20 69 66 20 75 6e 6b 20 2a 2f 0a 29 7b 0a  -1 if unk */.){.
169f0 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55    assert( roundU
16a00 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d  p==0 || roundUp=
16a10 3d 31 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =1 );.  if( ALWA
16a20 59 53 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20  YS(pVal) ){.    
16a30 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
16a40 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 73 61 6d  mple = pIdx->sam
16a50 70 6c 65 2e 61 3b 0a 20 20 20 20 69 6e 74 20 6e  ple.a;.    int n
16a60 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 73  Sample = pIdx->s
16a70 61 6d 70 6c 65 2e 6e 3b 0a 20 20 20 20 69 6e 74  ample.n;.    int
16a80 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
16a90 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
16aa0 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
16ab0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
16ac0 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 20 20  Sample>0 );.    
16ad0 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
16ae0 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
16af0 20 20 20 69 36 34 20 78 20 3d 20 73 71 6c 69 74     i64 x = sqlit
16b00 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
16b10 56 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Val);.      for(
16b20 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20  i=0; i<nSample; 
16b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16b40 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16b50 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
16b60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16b70 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16b80 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45  i].eType>=SQLITE
16b90 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20  _TEXT ) break;. 
16ba0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
16bb0 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 78 20 29 20 2a  le[i].u.i==x ) *
16bc0 70 6e 43 6f 70 79 20 3d 20 61 53 61 6d 70 6c 65  pnCopy = aSample
16bd0 5b 69 5d 2e 6e 43 6f 70 79 3b 0a 20 20 20 20 20  [i].nCopy;.     
16be0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
16bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16c00 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 78  aSample[i].u.i>x
16c10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
16c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16c30 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
16c40 5d 2e 75 2e 69 3e 3d 78 20 29 20 62 72 65 61 6b  ].u.i>=x ) break
16c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16c60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
16c70 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16c80 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 64  FLOAT ){.      d
16c90 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
16ca0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
16cb0 56 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Val);.      for(
16cc0 69 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20  i=0; i<nSample; 
16cd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16ce0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16cf0 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
16d00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16d10 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16d20 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45  i].eType>=SQLITE
16d30 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20  _TEXT ) break;. 
16d40 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
16d50 6c 65 5b 69 5d 2e 75 2e 72 3d 3d 72 20 29 20 2a  le[i].u.r==r ) *
16d60 70 6e 43 6f 70 79 20 3d 20 61 53 61 6d 70 6c 65  pnCopy = aSample
16d70 5b 69 5d 2e 6e 43 6f 70 79 3b 0a 20 20 20 20 20  [i].nCopy;.     
16d80 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
16d90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16da0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72  aSample[i].u.r>r
16db0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
16dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16dd0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
16de0 5d 2e 75 2e 72 3e 3d 72 20 29 20 62 72 65 61 6b  ].u.r>=r ) break
16df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16e00 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
16e10 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16e20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 69 20  NULL ){.      i 
16e30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 0;.      if( a
16e40 53 61 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d  Sample[0].eType=
16e50 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 2a  =SQLITE_NULL ) *
16e60 70 6e 43 6f 70 79 20 3d 20 61 53 61 6d 70 6c 65  pnCopy = aSample
16e70 5b 30 5d 2e 6e 43 6f 70 79 3b 0a 20 20 20 20 20  [0].nCopy;.     
16e80 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
16e90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
16ea0 3c 6e 53 61 6d 70 6c 65 20 26 26 20 61 53 61 6d  <nSample && aSam
16eb0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16ec0 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b  LITE_NULL ) i++;
16ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16ee0 73 65 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74  se{ .      sqlit
16ef0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16f00 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16f10 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16f20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
16f30 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
16f40 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16f50 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
16f60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16f70 4f 42 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OB );.      if( 
16f80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16f90 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20  OB ){.        z 
16fa0 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71  = (const u8 *)sq
16fb0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
16fc0 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  (pVal);.        
16fd0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
16fe0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61  tColl;.        a
16ff0 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e  ssert( pColl->en
17000 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
17010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17020 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
17030 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
17040 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
17050 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f  , 0, *pIdx->azCo
17060 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
17070 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20   pColl==0 ){.   
17080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
17090 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
170a0 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
170b0 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
170c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170d0 20 20 20 20 20 20 20 20 20 20 20 2a 70 49 64 78             *pIdx
170e0 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
170f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17100 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
17110 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20    }.        z = 
17120 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
17130 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
17140 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
17150 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29          if( !z )
17160 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17170 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17190 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20     assert( z && 
171a0 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
171b0 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a  xCmp );.      }.
171c0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
171d0 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c  3ValueBytes(pVal
171e0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a  , pColl->enc);..
171f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17200 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  <nSample; i++){.
17210 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
17220 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70         int eSamp
17230 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65  letype = aSample
17240 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  [i].eType;.     
17250 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
17260 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
17270 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65  || eSampletype<e
17280 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Type ) continue;
17290 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 53  .        if( (eS
172a0 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65  ampletype!=eType
172b0 29 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64  ) ) break;.#ifnd
172c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
172d0 54 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28  TF16.        if(
172e0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c   pColl->enc!=SQL
172f0 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
17300 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c        int nSampl
17310 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  e;.          cha
17320 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c  r *zSample = sql
17330 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20  ite3Utf8to16(.  
17340 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20              db, 
17350 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d  pColl->enc, aSam
17360 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d  ple[i].u.z, aSam
17370 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e  ple[i].nByte, &n
17380 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20  Sample.         
17390 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
173a0 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ( !zSample ){.  
173b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
173c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
173d0 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
173e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
173f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
17400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
17410 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
17420 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70  ll->pUser, nSamp
17430 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20  le, zSample, n, 
17440 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  z);.          sq
17450 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17460 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20  zSample);.      
17470 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
17480 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
17490 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
174a0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
174b0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
174c0 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  e, aSample[i].u.
174d0 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  z, n, z);.      
174e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
174f0 63 3d 3d 30 20 29 20 2a 70 6e 43 6f 70 79 20 3d  c==0 ) *pnCopy =
17500 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 43 6f 70   aSample[i].nCop
17510 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  y;.        if( c
17520 2d 72 6f 75 6e 64 55 70 3e 3d 30 20 29 20 62 72  -roundUp>=0 ) br
17530 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17540 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
17550 69 3e 3d 30 20 26 26 20 69 3c 3d 70 49 64 78 2d  i>=0 && i<=pIdx-
17560 3e 73 61 6d 70 6c 65 2e 6e 20 29 3b 0a 20 20 20  >sample.n );.   
17570 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a   *piRegion = i;.
17580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17590 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
175a0 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
175b0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
175c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
175d0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
175e0 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
175f0 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
17600 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
17610 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
17620 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
17630 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
17640 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
17650 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
17660 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
17670 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
17680 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
17690 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
176a0 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
176b0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
176c0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
176d0 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
176e0 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
176f0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
17700 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
17710 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
17720 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
17730 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
17740 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
17750 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
17760 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
17770 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
17780 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
17790 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
177a0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
177b0 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
177c0 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
177d0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
177e0 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
177f0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
17800 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
17810 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
17820 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
17830 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
17840 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17850 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
17860 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
17870 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17880 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
17890 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
178a0 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
178b0 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
178c0 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
178d0 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
178e0 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
178f0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
17900 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
17910 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
17920 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
17930 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
17940 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
17950 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
17960 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
17970 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
17980 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
17990 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50  e, iVar); /* IMP
179a0 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20  : R-23257-02778 
179b0 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  */.    *pp = sql
179c0 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
179d0 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
179e0 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
179f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17a00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
17a10 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
17a20 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
17a30 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
17a40 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
17a50 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
17a60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17a70 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
17a80 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
17a90 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
17aa0 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
17ab0 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
17ac0 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
17ad0 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
17ae0 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
17af0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
17b00 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
17b10 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
17b20 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
17b30 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
17b40 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
17b50 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
17b60 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
17b70 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
17b80 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
17b90 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
17ba0 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
17bb0 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
17bc0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
17bd0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
17be0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
17c10 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
17c30 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
17c60 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
17c70 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
17c80 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
17c90 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
17ca0 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
17cb0 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
17cc0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
17cd0 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
17ce0 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
17cf0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
17d00 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
17d10 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
17d20 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
17d30 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
17d40 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
17d50 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
17d60 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
17d70 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
17d80 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
17d90 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
17da0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
17db0 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
17dc0 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
17dd0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
17de0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
17df0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
17e00 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
17e10 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
17e20 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
17e30 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
17e40 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
17e50 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
17e60 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
17e70 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
17e80 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
17e90 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
17ea0 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
17eb0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
17ec0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17ed0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
17ee0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
17ef0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
17f00 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
17f10 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
17f20 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
17f30 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69  een 1 and 100, i
17f40 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75  nclusive. A retu
17f50 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31  rn.** value of 1
17f60 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
17f70 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e  the proposed ran
17f80 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ge scan is expec
17f90 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20  ted to visit.** 
17fa0 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f  approximately 1/
17fb0 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74 68  100th (1%) of th
17fc0 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20  e rows selected 
17fd0 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  by the nEq equal
17fe0 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
17ff0 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72  ts (if any). A r
18000 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
18010 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  00 indicates tha
18020 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65 64  t it is expected
18030 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e  .** that the ran
18040 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  ge scan will vis
18050 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31 30  it every row (10
18060 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79 20  0%) selected by 
18070 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  the equality.** 
18080 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
18090 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
180a0 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
180b0 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
180c0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
180d0 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
180e0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
180f0 65 20 62 79 20 33 2f 34 74 68 73 2e 20 20 48 65  e by 3/4ths.  He
18100 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e  nce a single con
18110 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a  straint (x>?).**
18120 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65   results in a re
18130 74 75 72 6e 20 6f 66 20 32 35 20 61 6e 64 20 61  turn of 25 and a
18140 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
18150 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
18160 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
18170 72 65 74 75 72 6e 20 6f 66 20 36 2e 0a 2a 2f 0a  return of 6..*/.
18180 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
18190 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
181a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
181b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
181c0 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
181d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
181e0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
181f0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
18200 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
18210 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
18220 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20  olumn; "x" */.  
18230 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20  int nEq,        
18240 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e       /* index in
18250 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20  to p->aCol[] of 
18260 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72  the range-compar
18270 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57  ed column */.  W
18280 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
18290 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
182a0 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
182b0 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
182c0 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
182d0 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
182e0 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
182f0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
18300 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
18310 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
18320 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20 20   int *piEst     
18330 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
18340 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  turn value */.){
18350 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18360 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
18370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18380 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  T2..  if( nEq==0
18390 20 26 26 20 70 2d 3e 73 61 6d 70 6c 65 2e 61 20   && p->sample.a 
183a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
183b0 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c 20  alue *pLowerVal 
183c0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
183d0 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56 61  _value *pUpperVa
183e0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
183f0 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c 6f  Est;.    int iLo
18400 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  wer = 0;.    int
18410 20 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 73 61   nSample = p->sa
18420 6d 70 6c 65 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  mple.n;.    int 
18430 69 55 70 70 65 72 20 3d 20 70 2d 3e 73 61 6d 70  iUpper = p->samp
18440 6c 65 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 72 6f  le.n;.    int ro
18450 75 6e 64 55 70 55 70 70 65 72 20 3d 20 30 3b 0a  undUpUpper = 0;.
18460 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 4c      int roundUpL
18470 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 75 33  ower = 0;.    u3
18480 32 20 6e 43 20 3d 20 30 3b 0a 20 20 20 20 75 38  2 nC = 0;.    u8
18490 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
184a0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
184b0 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
184c0 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72  ..    if( pLower
184d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
184e0 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
184f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
18500 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
18510 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
18520 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f  pExpr, aff, &pLo
18530 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 61  werVal);.      a
18540 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65  ssert( pLower->e
18550 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20  Operator==WO_GT 
18560 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  || pLower->eOper
18570 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  ator==WO_GE );. 
18580 20 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77 65       roundUpLowe
18590 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70  r = (pLower->eOp
185a0 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20 3f  erator==WO_GT) ?
185b0 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  1:0;.    }.    i
185c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
185d0 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20   && pUpper ){.  
185e0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
185f0 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
18600 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
18610 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
18620 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
18630 20 61 66 66 2c 20 26 70 55 70 70 65 72 56 61 6c   aff, &pUpperVal
18640 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18650 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74   pUpper->eOperat
18660 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70  or==WO_LT || pUp
18670 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
18680 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 72  WO_LE );.      r
18690 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20 28 70  oundUpUpper = (p
186a0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
186b0 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a 20  ==WO_LE) ?1:0;. 
186c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
186d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
186e0 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20  pLowerVal==0 && 
186f0 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b  pUpperVal==0) ){
18700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
18710 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61  lueFree(pLowerVa
18720 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
18730 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65  3ValueFree(pUppe
18740 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74  rVal);.      got
18750 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c  o range_est_fall
18760 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  back;.    }else 
18770 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30  if( pLowerVal==0
18780 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
18790 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
187a0 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65  pParse, p, pUppe
187b0 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70 70  rVal, roundUpUpp
187c0 65 72 2c 20 26 69 55 70 70 65 72 2c 20 26 6e 43  er, &iUpper, &nC
187d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
187e0 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69  wer ) iLower = i
187f0 55 70 70 65 72 2f 32 3b 0a 20 20 20 20 7d 65 6c  Upper/2;.    }el
18800 73 65 20 69 66 28 20 70 55 70 70 65 72 56 61 6c  se if( pUpperVal
18810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
18820 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
18830 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c  on(pParse, p, pL
18840 6f 77 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70  owerVal, roundUp
18850 4c 6f 77 65 72 2c 20 26 69 4c 6f 77 65 72 2c 20  Lower, &iLower, 
18860 26 6e 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &nC);.      if( 
18870 70 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20  pUpper ) iUpper 
18880 3d 20 28 69 4c 6f 77 65 72 20 2b 20 70 2d 3e 73  = (iLower + p->s
18890 61 6d 70 6c 65 2e 6e 20 2b 20 31 29 2f 32 3b 0a  ample.n + 1)/2;.
188a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
188b0 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
188c0 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
188d0 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72 6f 75  , pUpperVal, rou
188e0 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55 70 70  ndUpUpper, &iUpp
188f0 65 72 2c 20 26 6e 43 29 3b 0a 20 20 20 20 20 20  er, &nC);.      
18900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
18920 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
18930 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c  on(pParse, p, pL
18940 6f 77 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70  owerVal, roundUp
18950 4c 6f 77 65 72 2c 20 26 69 4c 6f 77 65 72 2c 20  Lower, &iLower, 
18960 26 6e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &nC);.      }.  
18970 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41    }.    WHERETRA
18980 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20  CE(("range scan 
18990 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c  regions: %d..%d\
189a0 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  n", iLower, iUpp
189b0 65 72 29 29 3b 0a 20 20 20 20 69 45 73 74 20 3d  er));.    iEst =
189c0 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
189d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
189e0 69 45 73 74 3d 3d 6e 53 61 6d 70 6c 65 20 29 3b  iEst==nSample );
189f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 45 73  .    assert( iEs
18a00 74 3c 3d 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  t<=nSample );.  
18a10 20 20 61 73 73 65 72 74 28 20 6e 53 61 6d 70 6c    assert( nSampl
18a20 65 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69  e>0 );.    if( i
18a30 45 73 74 3c 31 20 29 7b 0a 20 20 20 20 20 20 2a  Est<1 ){.      *
18a40 70 69 45 73 74 20 3d 20 35 30 2f 6e 53 61 6d 70  piEst = 50/nSamp
18a50 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  le;.    }else{. 
18a60 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20 28 69       *piEst = (i
18a70 45 73 74 2a 31 30 30 29 2f 6e 53 61 6d 70 6c 65  Est*100)/nSample
18a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18a90 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f  te3ValueFree(pLo
18aa0 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  werVal);.    sql
18ab0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55  ite3ValueFree(pU
18ac0 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 72 65  pperVal);.    re
18ad0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e  turn rc;.  }.ran
18ae0 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a  ge_est_fallback:
18af0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
18b00 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
18b10 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
18b20 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
18b30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71  ED_PARAMETER(nEq
18b40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
18b50 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
18b60 70 70 65 72 20 29 3b 0a 20 20 2a 70 69 45 73 74  pper );.  *piEst
18b70 20 3d 20 31 30 30 3b 0a 20 20 69 66 28 20 70 4c   = 100;.  if( pL
18b80 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d  ower && (pLower-
18b90 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
18ba0 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 69 45  VNULL)==0 ) *piE
18bb0 73 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28 20 70  st /= 4;.  if( p
18bc0 55 70 70 65 72 20 29 20 2a 70 69 45 73 74 20 2f  Upper ) *piEst /
18bd0 3d 20 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 4;.  return rc
18be0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
18bf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
18c00 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18c10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18c20 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18c30 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18c40 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
18c50 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
18c60 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
18c70 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
18c80 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
18c90 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
18ca0 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
18cb0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
18cc0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
18cd0 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
18ce0 74 65 5f 73 74 61 74 32 20 68 69 73 74 6f 67 72  te_stat2 histogr
18cf0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
18d00 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
18d10 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
18d20 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
18d30 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
18d40 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
18d50 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
18d60 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
18d70 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
18d80 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
18d90 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
18da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18db0 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
18dc0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
18dd0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
18de0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
18df0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
18e00 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
18e10 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
18e20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
18e30 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
18e40 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
18e50 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
18e60 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
18e70 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
18e80 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
18e90 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
18ea0 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
18eb0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
18ec0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
18ed0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
18ee0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
18ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18f00 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
18f10 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
18f20 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18f30 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
18f40 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
18f50 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
18f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18f70 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
18f80 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
18f90 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20  pTerm */.  Expr 
18fa0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
18fb0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
18fc0 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
18fd0 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
18fe0 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  t */.  double *p
18ff0 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
19000 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
19010 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
19020 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
19030 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d  e3_value *pRhs =
19040 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e   0;  /* VALUE on
19050 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
19060 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69   of pTerm */.  i
19070 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
19080 72 3b 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  r;       /* Rang
19090 65 20 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72  e of histogram r
190a0 65 67 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e  egions containin
190b0 67 20 70 52 68 73 20 2a 2f 0a 20 20 75 38 20 61  g pRhs */.  u8 a
190c0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
190d0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
190e0 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
190f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19100 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
19110 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
19120 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  de */.  double n
19130 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20  RowEst;         
19140 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
19150 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
19160 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 75 33 32  of rows */.  u32
19170 20 6e 43 20 3d 20 30 3b 20 20 20 20 20 20 20 20   nC = 0;        
19180 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 63 6f         /* Key co
19190 70 79 20 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 61  py count */..  a
191a0 73 73 65 72 74 28 20 70 2d 3e 73 61 6d 70 6c 65  ssert( p->sample
191b0 2e 61 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  .a!=0 );.  asser
191c0 74 28 20 70 2d 3e 73 61 6d 70 6c 65 2e 6e 3e 30  t( p->sample.n>0
191d0 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
191e0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
191f0 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
19200 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
19210 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
19220 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
19230 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
19240 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
19250 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
19260 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
19270 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
19280 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
19290 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
192a0 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
192b0 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
192c0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
192d0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e  .  rc = whereRan
192e0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
192f0 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 26 69 4c   p, pRhs, 0, &iL
19300 6f 77 65 72 2c 20 26 6e 43 29 3b 0a 20 20 69 66  ower, &nC);.  if
19310 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
19320 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
19330 6e 63 65 6c 3b 0a 20 20 69 66 28 20 6e 43 3d 3d  ncel;.  if( nC==
19340 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 68  0 ){.    rc = wh
19350 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
19360 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20  Parse, p, pRhs, 
19370 31 2c 20 26 69 55 70 70 65 72 2c 20 26 6e 43 29  1, &iUpper, &nC)
19380 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
19390 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63  oto whereEqualSc
193a0 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20  anEst_cancel;.  
193b0 7d 0a 20 20 69 66 28 20 6e 43 20 29 7b 0a 20 20  }.  if( nC ){.  
193c0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 65    WHERETRACE(("e
193d0 71 75 61 6c 69 74 79 20 73 63 61 6e 20 63 6f 75  quality scan cou
193e0 6e 74 3a 20 25 75 5c 6e 22 2c 20 6e 43 29 29 3b  nt: %u\n", nC));
193f0 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 43  .    *pnRow = nC
19400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57  ;.  }else{.    W
19410 48 45 52 45 54 52 41 43 45 28 28 22 65 71 75 61  HERETRACE(("equa
19420 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
19430 73 3a 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c  s: %d..%d\n", iL
19440 6f 77 65 72 2c 20 69 55 70 70 65 72 29 29 3b 0a  ower, iUpper));.
19450 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
19460 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
19470 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
19480 6f 77 45 73 74 5b 30 5d 2f 28 70 2d 3e 73 61 6d  owEst[0]/(p->sam
19490 70 6c 65 2e 6e 2a 33 29 3b 0a 20 20 20 20 20 20  ple.n*3);.      
194a0 69 66 28 20 6e 52 6f 77 45 73 74 3c 2a 70 6e 52  if( nRowEst<*pnR
194b0 6f 77 20 29 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  ow ) *pnRow = nR
194c0 6f 77 45 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  owEst;.    }else
194d0 7b 0a 20 20 20 20 20 20 6e 52 6f 77 45 73 74 20  {.      nRowEst 
194e0 3d 20 28 69 55 70 70 65 72 2d 69 4c 6f 77 65 72  = (iUpper-iLower
194f0 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  )*p->aiRowEst[0]
19500 2f 70 2d 3e 73 61 6d 70 6c 65 2e 6e 3b 0a 20 20  /p->sample.n;.  
19510 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
19520 77 45 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  wEst;.    }.  }.
19530 0a 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45  .whereEqualScanE
19540 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c  st_cancel:.  sql
19550 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
19560 68 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  hs);.  return rc
19570 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
19580 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19590 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f 0a 0a 23  BLE_STAT2) */..#
195a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
195b0 42 4c 45 5f 53 54 41 54 32 0a 2f 2a 0a 2a 2a 20  BLE_STAT2./*.** 
195c0 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  Estimate the num
195d0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
195e0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
195f0 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e  d based on.** an
19600 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   IN constraint w
19610 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
19620 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
19630 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  IN operator.** i
19640 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  s a list of valu
19650 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  es.  Example:.**
19660 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45  .**        WHERE
19670 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a   x IN (1,2,3,4).
19680 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
19690 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
196a0 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
196b0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
196c0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
196d0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
196e0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
196f0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
19700 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
19710 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
19720 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
19730 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
19740 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
19750 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
19760 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
19770 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
19780 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
19790 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
197a0 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
197b0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
197c0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
197d0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
197e0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
197f0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
19800 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
19810 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45  int whereInScanE
19820 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
19830 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
19840 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
19850 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
19860 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
19870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19880 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
19890 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
198a0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
198b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
198c0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69   /* The value li
198d0 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  st on the RHS of
198e0 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33   "x IN (v1,v2,v3
198f0 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62  ,...)" */.  doub
19900 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  le *pnRow       
19910 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
19920 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
19930 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
19940 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
19950 56 61 6c 20 3d 20 30 3b 20 20 2f 2a 20 4f 6e 65  Val = 0;  /* One
19960 20 76 61 6c 75 65 20 66 72 6f 6d 20 6c 69 73 74   value from list
19970 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72   */.  int iLower
19980 2c 20 69 55 70 70 65 72 3b 20 20 20 20 20 20 20  , iUpper;       
19990 2f 2a 20 52 61 6e 67 65 20 6f 66 20 68 69 73 74  /* Range of hist
199a0 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f  ogram regions co
199b0 6e 74 61 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f  ntaining pRhs */
199c0 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199e0 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
199f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
19a00 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
19a10 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
19a20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64  turn code */.  d
19a30 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20  ouble nRowEst;  
19a40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
19a50 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
19a60 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
19a70 2f 0a 20 20 69 6e 74 20 6e 53 70 61 6e 20 3d 20  /.  int nSpan = 
19a80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
19a90 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 73 74 6f   Number of histo
19aa0 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 73 70 61  gram regions spa
19ab0 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  nned */.  int nS
19ac0 69 6e 67 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  ingle = 0;      
19ad0 20 20 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d      /* Histogram
19ae0 20 72 65 67 69 6f 6e 73 20 68 69 74 20 62 79 20   regions hit by 
19af0 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a  a single value *
19b00 2f 0a 20 20 69 6e 74 20 6e 4e 6f 74 46 6f 75 6e  /.  int nNotFoun
19b10 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  d = 0;        /*
19b20 20 43 6f 75 6e 74 20 6f 66 20 76 61 6c 75 65 73   Count of values
19b30 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
19b40 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  nstants */.  int
19b50 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19b80 2a 2f 0a 20 20 75 33 32 20 6e 43 3b 20 20 20 20  */.  u32 nC;    
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 61 63 74          /* Exact
19bb0 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 66   count of rows f
19bc0 6f 72 20 61 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  or a key */.  in
19bd0 74 20 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 73  t nSample = p->s
19be0 61 6d 70 6c 65 2e 6e 3b 20 20 20 20 20 20 20 20  ample.n;        
19bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 61   /* Number of sa
19c00 6d 70 6c 65 73 20 2a 2f 0a 20 20 75 38 20 61 53  mples */.  u8 aS
19c10 70 61 6e 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 53  pan[SQLITE_MAX_S
19c20 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 20 20 2f 2a  AMPLES+1];    /*
19c30 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f   Histogram regio
19c40 6e 73 20 74 68 61 74 20 61 72 65 20 73 70 61 6e  ns that are span
19c50 6e 65 64 20 2a 2f 0a 20 20 75 38 20 61 53 69 6e  ned */.  u8 aSin
19c60 67 6c 65 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 53  gle[SQLITE_MAX_S
19c70 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 2f 2a 20 48  AMPLES+1];  /* H
19c80 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
19c90 20 68 69 74 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20   hit once */..  
19ca0 61 73 73 65 72 74 28 20 70 2d 3e 73 61 6d 70 6c  assert( p->sampl
19cb0 65 2e 61 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  e.a!=0 );.  asse
19cc0 72 74 28 20 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  rt( nSample>0 );
19cd0 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62  .  aff = p->pTab
19ce0 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f  le->aCol[p->aiCo
19cf0 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74  lumn[0]].affinit
19d00 79 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 70 61  y;.  memset(aSpa
19d10 6e 2c 20 30 2c 20 6e 53 61 6d 70 6c 65 2b 31 29  n, 0, nSample+1)
19d20 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 69 6e 67  ;.  memset(aSing
19d30 6c 65 2c 20 30 2c 20 6e 53 61 6d 70 6c 65 2b 31  le, 0, nSample+1
19d40 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
19d50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19d60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
19d70 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
19d80 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
19d90 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
19da0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
19db0 2c 20 61 66 66 2c 20 26 70 56 61 6c 29 3b 0a 20  , aff, &pVal);. 
19dc0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
19dd0 6b 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 3d  k;.    if( pVal=
19de0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61  =0 || sqlite3_va
19df0 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
19e00 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
19e10 20 20 20 20 20 6e 4e 6f 74 46 6f 75 6e 64 2b 2b       nNotFound++
19e20 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
19e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
19e40 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
19e50 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 56 61  n(pParse, p, pVa
19e60 6c 2c 20 30 2c 20 26 69 4c 6f 77 65 72 2c 20 26  l, 0, &iLower, &
19e70 6e 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nC);.    if( rc 
19e80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
19e90 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
19ea0 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 56  on(pParse, p, pV
19eb0 61 6c 2c 20 31 2c 20 26 69 55 70 70 65 72 2c 20  al, 1, &iUpper, 
19ec0 26 6e 43 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &nC);.    if( rc
19ed0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19ee0 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
19ef0 20 29 7b 0a 20 20 20 20 20 20 61 53 69 6e 67 6c   ){.      aSingl
19f00 65 5b 69 4c 6f 77 65 72 5d 20 3d 20 31 3b 0a 20  e[iLower] = 1;. 
19f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f20 61 73 73 65 72 74 28 20 69 4c 6f 77 65 72 3e 3d  assert( iLower>=
19f30 30 20 26 26 20 69 55 70 70 65 72 3c 3d 6e 53 61  0 && iUpper<=nSa
19f40 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20 77 68  mple );.      wh
19f50 69 6c 65 28 20 69 4c 6f 77 65 72 3c 69 55 70 70  ile( iLower<iUpp
19f60 65 72 20 29 20 61 53 70 61 6e 5b 69 4c 6f 77 65  er ) aSpan[iLowe
19f70 72 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  r++] = 1;.    }.
19f80 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
19f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
19fa0 6f 72 28 69 3d 6e 53 70 61 6e 3d 30 3b 20 69 3c  or(i=nSpan=0; i<
19fb0 3d 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  =nSample; i++){.
19fc0 20 20 20 20 20 20 69 66 28 20 61 53 70 61 6e 5b        if( aSpan[
19fd0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53  i] ){.        nS
19fe0 70 61 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  pan++;.      }el
19ff0 73 65 20 69 66 28 20 61 53 69 6e 67 6c 65 5b 69  se if( aSingle[i
1a000 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 69  ] ){.        nSi
1a010 6e 67 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ngle++;.      }.
1a020 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 45 73      }.    nRowEs
1a030 74 20 3d 20 28 6e 53 70 61 6e 2a 33 2b 6e 53 69  t = (nSpan*3+nSi
1a040 6e 67 6c 65 29 2a 70 2d 3e 61 69 52 6f 77 45 73  ngle)*p->aiRowEs
1a050 74 5b 30 5d 2f 28 33 2a 6e 53 61 6d 70 6c 65 29  t[0]/(3*nSample)
1a060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a070 2b 20 6e 4e 6f 74 46 6f 75 6e 64 2a 70 2d 3e 61  + nNotFound*p->a
1a080 69 52 6f 77 45 73 74 5b 31 5d 3b 0a 20 20 20 20  iRowEst[1];.    
1a090 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d  if( nRowEst > p-
1a0a0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e  >aiRowEst[0] ) n
1a0b0 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
1a0c0 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e  wEst[0];.    *pn
1a0d0 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
1a0e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
1a0f0 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a  IN row estimate:
1a100 20 6e 53 70 61 6e 3d 25 64 2c 20 6e 53 69 6e 67   nSpan=%d, nSing
1a110 6c 65 3d 25 64 2c 20 6e 4e 6f 74 46 6f 75 6e 64  le=%d, nNotFound
1a120 3d 25 64 2c 20 65 73 74 3d 25 67 5c 6e 22 2c 0a  =%d, est=%g\n",.
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 6e 53 70 61 6e 2c 20 6e 53 69 6e 67 6c 65 2c   nSpan, nSingle,
1a150 20 6e 4e 6f 74 46 6f 75 6e 64 2c 20 6e 52 6f 77   nNotFound, nRow
1a160 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Est));.  }.  sql
1a170 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
1a180 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  al);.  return rc
1a190 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1a1a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a1b0 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f 0a 0a 0a  BLE_STAT2) */...
1a1c0 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
1a1d0 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 66  est query plan f
1a1e0 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
1a1f0 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
1a200 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62    Write the.** b
1a210 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61  est query plan a
1a220 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f  nd its cost into
1a230 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f   the WhereCost o
1a240 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 61  bject supplied a
1a250 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  s the.** last pa
1a260 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1a270 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
1a280 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63  lan wins.  The c
1a290 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61  ost is an estima
1a2a0 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74  te of the amount
1a2b0 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64   of.** CPU and d
1a2c0 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65 64 20 74  isk I/O needed t
1a2d0 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65  o process the re
1a2e0 71 75 65 73 74 65 64 20 72 65 73 75 6c 74 2e 0a  quested result..
1a2f0 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20  ** Factors that 
1a300 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69  influence cost i
1a310 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
1a320 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65   *  The estimate
1a330 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
1a340 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
1a350 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a  trieved.  (The.*
1a360 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68  *       fewer th
1a370 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a  e better.).**.**
1a380 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
1a390 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75  r not sorting mu
1a3a0 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  st occur..**.** 
1a3b0 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
1a3c0 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20   not there must 
1a3d0 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b  be separate look
1a3e0 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ups in the.**   
1a3f0 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e      index and in
1a400 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
1a410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
1a420 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42  was an INDEXED B
1a430 59 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e  Y clause (pSrc->
1a440 70 49 6e 64 65 78 29 20 61 74 74 61 63 68 65 64  pIndex) attached
1a450 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
1a460 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
1a470 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  ement, then this
1a480 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63   function only c
1a490 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75  onsiders plans u
1a4a0 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d  sing the .** nam
1a4b0 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20  ed index. If no 
1a4c0 73 75 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75  such plan is fou
1a4d0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  nd, then the ret
1a4e0 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a  urned cost is.**
1a4f0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e   SQLITE_BIG_DBL.
1a500 20 49 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f   If a plan is fo
1a510 75 6e 64 20 74 68 61 74 20 75 73 65 73 20 74 68  und that uses th
1a520 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a  e named index, .
1a530 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74  ** then the cost
1a540 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69   is calculated i
1a550 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e  n the usual way.
1a560 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20  .**.** If a NOT 
1a570 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 28  INDEXED clause (
1a580 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
1a590 21 3d 30 29 20 77 61 73 20 61 74 74 61 63 68 65  !=0) was attache
1a5a0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a  d to the table .
1a5b0 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ** in the SELECT
1a5c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1a5d0 20 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20   no indexes are 
1a5e0 63 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65  considered. Howe
1a5f0 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c  ver, the .** sel
1a600 65 63 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73  ected plan may s
1a610 74 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74  till take advant
1a620 61 67 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74  age of the built
1a630 2d 69 6e 20 72 6f 77 69 64 20 70 72 69 6d 61 72  -in rowid primar
1a640 79 20 6b 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a  y key.** index..
1a650 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1a660 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20  estBtreeIndex(. 
1a670 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a690 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1a6a0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1a6b0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1a6c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1a6d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1a6e0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1a6f0 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
1a700 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1a710 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1a720 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1a730 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1a740 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
1a750 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
1a760 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
1a770 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
1a780 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
1a790 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1a7a0 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
1a7b0 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
1a7c0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
1a7d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
1a7e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1a7f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73    ExprList *pDis
1a800 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  tinct,        /*
1a810 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   The select-list
1a820 20 69 66 20 71 75 65 72 79 20 69 73 20 44 49 53   if query is DIS
1a830 54 49 4e 43 54 20 2a 2f 0a 20 20 57 68 65 72 65  TINCT */.  Where
1a840 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
1a850 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
1a860 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
1a870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75   */.){.  int iCu
1a880 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
1a890 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
1a8a0 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
1a8b0 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
1a8c0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62  /.  Index *pProb
1a8d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a8e0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61  /* An index we a
1a8f0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f  re evaluating */
1a900 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a920 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65  * Copy of pProbe
1a930 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50  , or zero for IP
1a940 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  K index */.  int
1a950 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20   eqTermMask;    
1a960 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1a970 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  ent mask of vali
1a980 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
1a990 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  tors */.  int id
1a9a0 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20  xEqTermMask;    
1a9b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d        /* Index m
1a9c0 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75  ask of valid equ
1a9d0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
1a9e0 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20  */.  Index sPk; 
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78   /* A fake index
1aa10 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
1aa20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
1aa30 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 61 69   unsigned int ai
1aa40 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 2f 2a 20  RowEstPk[2]; /* 
1aa50 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76  The aiRowEst[] v
1aa60 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
1aa70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1aa80 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
1aa90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
1aaa0 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
1aab0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
1aac0 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67   */.  int wsFlag
1aad0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1aae0 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61    /* Allowed fla
1aaf0 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e 70 6c 61  gs in pCost->pla
1ab00 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20 20 2f  n.wsFlag */..  /
1ab10 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1ab20 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72 73 74   cost to a worst
1ab30 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20  -case value */. 
1ab40 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30   memset(pCost, 0
1ab50 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29  , sizeof(*pCost)
1ab60 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73  );.  pCost->rCos
1ab70 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
1ab80 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  BL;..  /* If the
1ab90 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20 74   pSrc table is t
1aba0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1abb0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1abc0 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20  en we may not.  
1abd0 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ** use an index 
1abe0 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e 55  to satisfy IS NU
1abf0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
1ac00 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54  n that table.  T
1ac10 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61  his is.  ** beca
1ac20 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68  use columns migh
1ac30 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e  t end up being N
1ac40 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65  ULL if the table
1ac50 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
1ac60 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73  -.  ** a circums
1ac70 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65 20  tance which the 
1ac80 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c  index cannot hel
1ac90 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20  p us discover.  
1aca0 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20  Ticket #2177..  
1acb0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a  */.  if( pSrc->j
1acc0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
1acd0 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65  T ){.    idxEqTe
1ace0 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
1acf0 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_IN;.  }else{. 
1ad00 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
1ad10 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
1ad20 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  O_ISNULL;.  }.. 
1ad30 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
1ad40 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
1ad50 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1ad60 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
1ad70 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
1ad80 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78   use */.    pIdx
1ad90 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63   = pProbe = pSrc
1ada0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73  ->pIndex;.    ws
1adb0 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45  FlagMask = ~(WHE
1adc0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
1add0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a  E_ROWID_RANGE);.
1ade0 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
1adf0 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a   idxEqTermMask;.
1ae00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ae10 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45  There is no INDE
1ae20 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
1ae30 43 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e  Create a fake In
1ae40 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f  dex object in lo
1ae50 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  cal.    ** varia
1ae60 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65  ble sPk to repre
1ae70 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70  sent the rowid p
1ae80 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
1ae90 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20  .  Make this.   
1aea0 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74   ** fake index t
1aeb0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68  he first in a ch
1aec0 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a  ain of Index obj
1aed0 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66  ects with all of
1aee0 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a   the real.    **
1aef0 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c   indices to foll
1af00 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ow */.    Index 
1af10 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1af20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1af30 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63  st of real indic
1af40 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  es on the table 
1af50 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
1af60 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e  Pk, 0, sizeof(In
1af70 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e  dex));.    sPk.n
1af80 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
1af90 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26  sPk.aiColumn = &
1afa0 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20  aiColumnPk;.    
1afb0 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61  sPk.aiRowEst = a
1afc0 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73  iRowEstPk;.    s
1afd0 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  Pk.onError = OE_
1afe0 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b  Replace;.    sPk
1aff0 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e  .pTable = pSrc->
1b000 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f 77 45  pTab;.    aiRowE
1b010 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e  stPk[0] = pSrc->
1b020 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  pTab->nRowEst;. 
1b030 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d     aiRowEstPk[1]
1b040 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74   = 1;.    pFirst
1b050 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
1b060 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
1b070 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  Src->notIndexed=
1b080 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1b090 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  he real indices 
1b0a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  of the table are
1b0b0 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64   only considered
1b0c0 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   if the.      **
1b0d0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61   NOT INDEXED qua
1b0e0 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65  lifier is omitte
1b0f0 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20  d from the FROM 
1b100 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1b110 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72  sPk.pNext = pFir
1b120 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  st;.    }.    pP
1b130 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20  robe = &sPk;.   
1b140 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
1b150 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 43  .        WHERE_C
1b160 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1b170 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43  OLUMN_EQ|WHERE_C
1b180 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45  OLUMN_NULL|WHERE
1b190 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20  _COLUMN_RANGE.  
1b1a0 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d    );.    eqTermM
1b1b0 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
1b1c0 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  N;.    pIdx = 0;
1b1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  .  }..  /* Loop 
1b1e0 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73  over all indices
1b1f0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65   looking for the
1b200 20 62 65 73 74 20 6f 6e 65 20 74 6f 20 75 73 65   best one to use
1b210 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50  .  */.  for(; pP
1b220 72 6f 62 65 3b 20 70 49 64 78 3d 70 50 72 6f 62  robe; pIdx=pProb
1b230 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  e=pProbe->pNext)
1b240 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
1b250 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f 6e 73 74  gned int * const
1b260 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50 72 6f   aiRowEst = pPro
1b270 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  be->aiRowEst;.  
1b280 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20    double cost;  
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2a0 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70   Cost of using p
1b2b0 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64 6f 75  Probe */.    dou
1b2c0 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  ble nRow;       
1b2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
1b2e0 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
1b2f0 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74 20 73  rows in result s
1b300 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  et */.    double
1b310 20 6c 6f 67 31 30 4e 3b 20 20 20 20 20 20 20 20   log10N;        
1b320 20 20 20 20 20 20 2f 2a 20 62 61 73 65 2d 31 30        /* base-10
1b330 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 6e 52   logarithm of nR
1b340 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a 2f 0a  ow (inexact) */.
1b350 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20      int rev;    
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
1b380 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
1b390 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c   */.    int wsFl
1b3a0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  ags = 0;.    Bit
1b3b0 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
1b3c0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1b3d0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61  wing variables a
1b3e0 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  re populated bas
1b3f0 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72  ed on the proper
1b400 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 69  ties of.    ** i
1b410 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75  ndex being evalu
1b420 61 74 65 64 2e 20 54 68 65 79 20 61 72 65 20 74  ated. They are t
1b430 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  hen used to dete
1b440 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63 74  rmine the expect
1b450 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61  ed.    ** cost a
1b460 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  nd number of row
1b470 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  s returned..    
1b480 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20  **.    **  nEq: 
1b490 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65  .    **    Numbe
1b4a0 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65  r of equality te
1b4b0 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  rms that can be 
1b4c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
1b4d0 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  g the index..   
1b4e0 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65 72 20   **    In other 
1b4f0 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d 62 65  words, the numbe
1b500 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66 69 65  r of initial fie
1b510 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  lds in the index
1b520 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20   that.    **    
1b530 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d 20 6f  are used in == o
1b540 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55 4c 4c  r IN or NOT NULL
1b550 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
1b560 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1b570 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b580 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20 20 2a   nInMul:  .    *
1b590 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d 75 6c  *    The "in-mul
1b5a0 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73 20 69  tiplier". This i
1b5b0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1b5c0 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b 20 6f   how many seek o
1b5d0 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20 20 2a  perations .    *
1b5e0 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74  *    SQLite must
1b5f0 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68 65 20   perform on the 
1b600 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74 69 6f  index in questio
1b610 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n. For example, 
1b620 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
1b630 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69    WHERE clause i
1b640 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1b650 20 20 20 20 20 20 57 48 45 52 45 20 61 20 49 4e        WHERE a IN
1b660 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44 20 62   (1, 2, 3) AND b
1b670 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a 20 20   IN (4, 5, 6).  
1b680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
1b690 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
1b6a0 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f 6e 20  rm 9 lookups on 
1b6b0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
1b6c0 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20 69 73  b), so nInMul is
1b6d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65 74 20   .    **    set 
1b6e0 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68 65 20  to 9. Given the 
1b6f0 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e 64 20  same schema and 
1b700 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1b710 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20 0a 20  llowing WHERE . 
1b720 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73 65 73     **    clauses
1b730 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1b740 20 20 20 20 20 57 48 45 52 45 20 61 20 3d 20 20       WHERE a =  
1b750 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  1.    **      WH
1b760 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20 20 2a  ERE a >= 2.    *
1b770 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d  *.    **    nInM
1b780 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31 2e 0a  ul is set to 1..
1b790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b7a0 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
1b7b0 20 61 20 57 48 45 52 45 20 74 65 72 6d 20 6f 66   a WHERE term of
1b7c0 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49 4e 20   the form "x IN 
1b7d0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c 20 74  (SELECT ...)", t
1b7e0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  hen .    **    t
1b7f0 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 73  he sub-select is
1b800 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65 74 75   assumed to retu
1b810 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72 20 74  rn 25 rows for t
1b820 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 0a  he purposes of .
1b830 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65 72 6d      **    determ
1b840 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a 20 20  ining nInMul..  
1b850 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 49 6e    **.    **  bIn
1b860 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20  Est:  .    **   
1b870 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
1b880 74 68 65 72 65 20 77 61 73 20 61 74 20 6c 65 61  there was at lea
1b890 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28 53 45  st one "x IN (SE
1b8a0 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72 6d 20  LECT ...)" term 
1b8b0 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20 20 20  used .    **    
1b8c0 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  in determining t
1b8d0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49 6e 4d  he value of nInM
1b8e0 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ul.  Note that t
1b8f0 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 20 20  he RHS of the.  
1b900 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65 72 61    **    IN opera
1b910 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20 53 45  tor must be a SE
1b920 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61 6c 75  LECT, not a valu
1b930 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68 69 73  e list, for this
1b940 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1b950 20 20 20 20 74 6f 20 62 65 20 74 72 75 65 2e 0a      to be true..
1b960 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65      **.    **  e
1b970 73 74 42 6f 75 6e 64 3a 0a 20 20 20 20 2a 2a 20  stBound:.    ** 
1b980 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65 20 6f     An estimate o
1b990 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1b9a0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1b9b0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 2e  ust be searched.
1b9c0 20 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 76 61    A.    **    va
1b9d0 6c 75 65 20 6f 66 20 31 30 30 20 6d 65 61 6e 73  lue of 100 means
1b9e0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
1b9f0 65 20 69 73 20 73 65 61 72 63 68 65 64 2e 20 20  e is searched.  
1ba00 52 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  Range constraint
1ba10 73 0a 20 20 20 20 2a 2a 20 20 20 20 6d 69 67 68  s.    **    migh
1ba20 74 20 72 65 64 75 63 65 20 74 68 69 73 20 74 6f  t reduce this to
1ba30 20 61 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68   a value less th
1ba40 61 6e 20 31 30 30 20 74 6f 20 69 6e 64 69 63 61  an 100 to indica
1ba50 74 65 20 74 68 61 74 20 6f 6e 6c 79 0a 20 20 20  te that only.   
1ba60 20 2a 2a 20 20 20 20 61 20 66 72 61 63 74 69 6f   **    a fractio
1ba70 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6e  n of the table n
1ba80 65 65 64 73 20 73 65 61 72 63 68 69 6e 67 2e 20  eeds searching. 
1ba90 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
1baa0 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 73 71 6c  of.    **    sql
1bab0 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a  ite_stat2 ANALYZ
1bac0 45 20 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65  E data, a single
1bad0 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75   inequality redu
1bae0 63 65 73 20 74 68 65 20 73 65 61 72 63 68 0a 20  ces the search. 
1baf0 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65 20 74     **    space t
1bb00 6f 20 31 2f 34 72 64 20 69 74 73 20 6f 72 69 67  o 1/4rd its orig
1bb10 69 6e 61 6c 20 73 69 7a 65 2e 20 20 53 6f 20 61  inal size.  So a
1bb20 6e 20 78 3e 3f 20 63 6f 6e 73 74 72 61 69 6e 74  n x>? constraint
1bb30 20 72 65 64 75 63 65 73 0a 20 20 20 20 2a 2a 20   reduces.    ** 
1bb40 20 20 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 32     estBound to 2
1bb50 35 2e 20 20 54 77 6f 20 63 6f 6e 73 74 72 61 69  5.  Two constrai
1bb60 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
1bb70 29 20 72 65 64 75 63 65 20 65 73 74 42 6f 75 6e  ) reduce estBoun
1bb80 64 20 74 6f 20 36 2e 0a 20 20 20 20 2a 2a 0a 20  d to 6..    **. 
1bb90 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20     **  bSort:   
1bba0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
1bbb0 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68 65 72  an. True if ther
1bbc0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1bbd0 20 63 6c 61 75 73 65 20 74 68 61 74 20 77 69 6c   clause that wil
1bbe0 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a 20 20  l require an .  
1bbf0 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e 61 6c    **    external
1bc00 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63 61 6e   sort (i.e. scan
1bc10 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 62  ning the index b
1bc20 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 77  eing evaluated w
1bc30 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  ill not .    ** 
1bc40 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f 72 64     correctly ord
1bc50 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20 20 20  er records)..   
1bc60 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f   **.    **  bLoo
1bc70 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  kup: .    **    
1bc80 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
1bc90 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 20   a table lookup 
1bca0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1bcb0 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79  each index entry
1bcc0 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73 69 74  .    **    visit
1bcd0 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ed.  In other wo
1bce0 72 64 73 2c 20 74 72 75 65 20 69 66 20 74 68 69  rds, true if thi
1bcf0 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76 65 72  s is not a cover
1bd00 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  ing index..    *
1bd10 2a 20 20 20 20 54 68 69 73 20 69 73 20 61 6c 77  *    This is alw
1bd20 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 74 68  ays false for th
1bd30 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  e rowid primary 
1bd40 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61 20 74  key index of a t
1bd50 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  able..    **    
1bd60 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65  For other indexe
1bd70 73 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e  s, it is true un
1bd80 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63 6f 6c  less all the col
1bd90 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
1bda0 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73 65 64  e.    **    used
1bdb0 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
1bdc0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65  tatement are pre
1bdd0 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65  sent in the inde
1bde0 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20 20 2a  x (such an.    *
1bdf0 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20 73 6f  *    index is so
1be00 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69 62 65  metimes describe
1be10 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  d as a covering 
1be20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20  index)..    **  
1be30 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67    For example, g
1be40 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  iven the index o
1be50 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65  n (a, b), the se
1be60 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c  cond of the foll
1be70 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20  owing .    **   
1be80 20 74 77 6f 20 71 75 65 72 69 65 73 20 72 65 71   two queries req
1be90 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72  uires table b-tr
1bea0 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 6f 72  ee lookups in or
1beb0 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20  der to find the 
1bec0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20 20 20  value.    **    
1bed0 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62 75 74  of column c, but
1bee0 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73 20   the first does 
1bef0 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f 6c 75  not because colu
1bf00 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a  mns a and b are.
1bf10 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68 20 61      **    both a
1bf20 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1bf30 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
1bf40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1bf50 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20   SELECT a, b    
1bf60 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
1bf70 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20   = 1;.    **    
1bf80 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
1bf90 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c  a, b, c FROM tbl
1bfa0 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
1bfb0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71    */.    int nEq
1bfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bfd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bfe0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1bff0 6d 73 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  ms matching inde
1c000 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 49 6e  x */.    int bIn
1c010 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Est = 0;        
1c020 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c030 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e  f "x IN (SELECT.
1c040 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ..)" seen */.   
1c050 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20 31 3b   int nInMul = 1;
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c070 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74  * Number of dist
1c080 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65 73 20  inct equalities 
1c090 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20  to lookup */.   
1c0a0 20 69 6e 74 20 65 73 74 42 6f 75 6e 64 20 3d 20   int estBound = 
1c0b0 31 30 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  100;           /
1c0c0 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65 64 75  * Estimated redu
1c0d0 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63 68 20  ction in search 
1c0e0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74  space */.    int
1c0f0 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   nBound = 0;    
1c100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c110 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20 63 6f  mber of range co
1c120 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e 20 2a  nstraints seen *
1c130 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f 72 74 20  /.    int bSort 
1c140 3d 20 21 21 70 4f 72 64 65 72 42 79 3b 20 20 20  = !!pOrderBy;   
1c150 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
1c160 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72 65 71  xternal sort req
1c170 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  uired */.    int
1c180 20 62 44 69 73 74 20 3d 20 21 21 70 44 69 73 74   bDist = !!pDist
1c190 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  inct;      /* Tr
1c1a0 75 65 20 69 66 20 69 6e 64 65 78 20 63 61 6e 6e  ue if index cann
1c1b0 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44 49 53  ot help with DIS
1c1c0 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  TINCT */.    int
1c1d0 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20 20 20   bLookup = 0;   
1c1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c1f0 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f 76 65  ue if not a cove
1c200 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1c210 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1c220 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1c230 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
1c240 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1c250 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  ause */.#ifdef S
1c260 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1c270 54 32 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  T2.    WhereTerm
1c280 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d 20 30   *pFirstTerm = 0
1c290 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65  ;    /* First te
1c2a0 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  rm matching the 
1c2b0 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a  index */.#endif.
1c2c0 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
1c2d0 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
1c2e0 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20 2a  nEq and nInMul *
1c2f0 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 30 3b  /.    for(nEq=0;
1c300 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
1c310 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20  lumn; nEq++){.  
1c320 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
1c330 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
1c340 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
1c350 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1c360 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
1c370 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49  , eqTermMask, pI
1c380 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
1c390 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
1c3a0 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
1c3b0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1c3c0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  EQ|WHERE_ROWID_E
1c3d0 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  Q);.      if( pT
1c3e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1c3f0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1c400 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1c410 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
1c420 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1c430 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1c440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
1c450 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c460 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1c470 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1c480 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
1c490 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d 65 20   ...)":  Assume 
1c4a0 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72  the SELECT retur
1c4b0 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20  ns 25 rows */.  
1c4c0 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1c4d0 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20 20  = 25;.          
1c4e0 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20 20  bInEst = 1;.    
1c4f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
1c500 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
1c510 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ist && pExpr->x.
1c520 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  pList->nExpr) ){
1c530 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78  .          /* "x
1c540 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
1c550 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20  e, ...)" */.    
1c560 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20        nInMul *= 
1c570 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1c580 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  nExpr;.        }
1c590 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c5a0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1c5b0 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
1c5c0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1c5d0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
1c5e0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 23  _NULL;.      }.#
1c5f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c600 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 20 20  BLE_STAT2.      
1c610 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 50  if( nEq==0 && pP
1c620 72 6f 62 65 2d 3e 73 61 6d 70 6c 65 2e 61 20 29  robe->sample.a )
1c630 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70 54   pFirstTerm = pT
1c640 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  erm;.#endif.    
1c650 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d    used |= pTerm-
1c660 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
1c670 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65    }..    /* Dete
1c680 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
1c690 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a 2f 0a  of estBound. */.
1c6a0 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f      if( nEq<pPro
1c6b0 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70  be->nColumn && p
1c6c0 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
1c6d0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  d==0 ){.      in
1c6e0 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
1c6f0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
1c700 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
1c710 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
1c720 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1c730 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
1c740 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
1c750 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
1c760 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  p = findTerm(pWC
1c770 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1c780 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
1c790 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1c7a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74 6d   WhereTerm *pBtm
1c7b0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1c7c0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1c7d0 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1c7e0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1c7f0 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
1c800 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1c810 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f  , nEq, pBtm, pTo
1c820 70 2c 20 26 65 73 74 42 6f 75 6e 64 29 3b 0a 20  p, &estBound);. 
1c830 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20         if( pTop 
1c840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f  ){.          nBo
1c850 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
1c860 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1c870 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
1c880 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
1c890 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67   pTop->prereqRig
1c8a0 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
1c8b0 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
1c8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
1c8d0 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nd++;.          
1c8e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1c8f0 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
1c900 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42        used |= pB
1c910 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
1c920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c930 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57     wsFlags |= (W
1c940 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1c950 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  E|WHERE_ROWID_RA
1c960 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NGE);.      }.  
1c970 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
1c980 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
1c990 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65  None ){.      te
1c9a0 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
1c9b0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
1c9c0 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
1c9d0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
1c9e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1c9f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77   );.      if( (w
1ca00 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
1ca10 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
1ca20 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30  COLUMN_NULL))==0
1ca30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1ca40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
1ca50 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  QUE;.      }.   
1ca60 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1ca70 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1ca80 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
1ca90 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f  e index being co
1caa0 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20  nsidered will.  
1cab0 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73    ** naturally s
1cac0 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20  can rows in the 
1cad0 72 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20  required order, 
1cae0 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69  set the appropri
1caf0 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a  ate flags.    **
1cb00 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74 68   in wsFlags. Oth
1cb10 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
1cb20 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1cb30 63 6c 61 75 73 65 20 62 75 74 20 74 68 65 20 69  clause but the i
1cb40 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  ndex.    ** will
1cb50 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61 20   scan rows in a 
1cb60 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 2c  different order,
1cb70 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 20 76   set the bSort v
1cb80 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
1cb90 20 69 66 28 20 69 73 53 6f 72 74 69 6e 67 49 6e   if( isSortingIn
1cba0 64 65 78 28 0a 20 20 20 20 20 20 20 20 20 20 70  dex(.          p
1cbb0 50 61 72 73 65 2c 20 70 57 43 2d 3e 70 4d 61 73  Parse, pWC->pMas
1cbc0 6b 53 65 74 2c 20 70 50 72 6f 62 65 2c 20 69 43  kSet, pProbe, iC
1cbd0 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 6e 45  ur, pOrderBy, nE
1cbe0 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72 65 76  q, wsFlags, &rev
1cbf0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  ).    ){.      b
1cc00 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
1cc10 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1cc20 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48 45  _ROWID_RANGE|WHE
1cc30 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
1cc40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
1cc50 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1cc60 28 72 65 76 20 3f 20 57 48 45 52 45 5f 52 45 56  (rev ? WHERE_REV
1cc70 45 52 53 45 20 3a 20 30 29 3b 0a 20 20 20 20 7d  ERSE : 0);.    }
1cc80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1cc90 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54 20  e is a DISTINCT 
1cca0 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20 74 68  qualifier and th
1ccb0 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 63  is index will sc
1ccc0 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 2a  an rows in.    *
1ccd0 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 44  * order of the D
1cce0 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
1ccf0 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69 73 74  ons, clear bDist
1cd00 20 61 6e 64 20 73 65 74 20 74 68 65 20 61 70 70   and set the app
1cd10 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a 2a 20  ropriate.    ** 
1cd20 66 6c 61 67 73 20 69 6e 20 77 73 46 6c 61 67 73  flags in wsFlags
1cd30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 44  . */.    if( isD
1cd40 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70 50 61  istinctIndex(pPa
1cd50 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f 62 65  rse, pWC, pProbe
1cd60 2c 20 69 43 75 72 2c 20 70 44 69 73 74 69 6e 63  , iCur, pDistinc
1cd70 74 2c 20 6e 45 71 29 20 29 7b 0a 20 20 20 20 20  t, nEq) ){.     
1cd80 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   bDist = 0;.    
1cd90 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1cda0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
1cdb0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1cdc0 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  E|WHERE_DISTINCT
1cdd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cde0 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c  If currently cal
1cdf0 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73  culating the cos
1ce00 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  t of using an in
1ce10 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b  dex (not the IPK
1ce20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20  .    ** index), 
1ce30 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c  determine if all
1ce40 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
1ce50 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74   data may be obt
1ce60 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20  ained without . 
1ce70 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20     ** using the 
1ce80 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e  main table (i.e.
1ce90 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   if the index is
1cea0 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   a covering.    
1ceb0 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69  ** index for thi
1cec0 73 20 71 75 65 72 79 29 2e 20 49 66 20 69 74 20  s query). If it 
1ced0 69 73 2c 20 73 65 74 20 74 68 65 20 57 48 45 52  is, set the WHER
1cee0 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20  E_IDX_ONLY flag 
1cef0 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61 67  in.    ** wsFlag
1cf00 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
1cf10 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
1cf20 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
1cf30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1cf40 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b 0a 20   && wsFlags ){. 
1cf50 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
1cf60 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
1cf70 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1cf80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
1cf90 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
1cfa0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
1cfb0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1cfc0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
1cfd0 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
1cfe0 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
1cff0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
1d000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d010 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
1d020 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1d030 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
1d040 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  _ONLY;.      }el
1d050 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f  se{.        bLoo
1d060 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  kup = 1;.      }
1d070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1d080 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20 74     ** Estimate t
1d090 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1d0a0 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46 6f  s of output.  Fo
1d0b0 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45 4c 45  r an "x IN (SELE
1d0c0 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63  CT...)".    ** c
1d0d0 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f  onstraint, do no
1d0e0 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61  t let the estima
1d0f0 74 65 20 65 78 63 65 65 64 20 68 61 6c 66 20 74  te exceed half t
1d100 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  he rows in the t
1d110 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
1d120 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29   nRow = (double)
1d130 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20 2a  (aiRowEst[nEq] *
1d140 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66   nInMul);.    if
1d150 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52 6f 77  ( bInEst && nRow
1d160 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  *2>aiRowEst[0] )
1d170 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 61  {.      nRow = a
1d180 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20  iRowEst[0]/2;.  
1d190 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e      nInMul = (in
1d1a0 74 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45  t)(nRow / aiRowE
1d1b0 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a  st[nEq]);.    }.
1d1c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d1d0 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20  NABLE_STAT2.    
1d1e0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74 72  /* If the constr
1d1f0 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
1d200 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f 72 20 78  orm x=VALUE or x
1d210 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e 2e 29 0a   IN (E1,E2,...).
1d220 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20 64 6f      ** and we do
1d230 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68 61 74 20   not think that 
1d240 76 61 6c 75 65 73 20 6f 66 20 78 20 61 72 65 20  values of x are 
1d250 75 6e 69 71 75 65 20 61 6e 64 20 69 66 20 68 69  unique and if hi
1d260 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64  stogram.    ** d
1d270 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
1d280 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74   for column x, t
1d290 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62 65 20  hen it might be 
1d2a0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20  possible.    ** 
1d2b0 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
1d2c0 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20  estimate on the 
1d2d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
1d2e0 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56  ased on.    ** V
1d2f0 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d  ALUE and how com
1d300 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65 20 69  mon that value i
1d310 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
1d320 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20  he histogram..  
1d330 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f    */.    if( nRo
1d340 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 6e  w>(double)1 && n
1d350 45 71 3d 3d 31 20 26 26 20 70 46 69 72 73 74 54  Eq==1 && pFirstT
1d360 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f 77 45  erm!=0 && aiRowE
1d370 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20 20 20  st[1]>1 ){.     
1d380 20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d   if( pFirstTerm-
1d390 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1d3a0 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29  _EQ|WO_ISNULL) )
1d3b0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1d3c0 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  se( pFirstTerm->
1d3d0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
1d3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1d3f0 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d  case( pFirstTerm
1d400 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1d410 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1d420 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e    whereEqualScan
1d430 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1d440 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  be, pFirstTerm->
1d450 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1d460 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nRow);.      }el
1d470 73 65 20 69 66 28 20 70 46 69 72 73 74 54 65 72  se if( pFirstTer
1d480 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1d490 5f 49 4e 20 26 26 20 62 49 6e 45 73 74 3d 3d 30  _IN && bInEst==0
1d4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72   ){.        wher
1d4b0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
1d4c0 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
1d4d0 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  tTerm->pExpr->x.
1d4e0 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a 20  pList, &nRow);. 
1d4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1d500 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1d510 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 20  ABLE_STAT2 */.. 
1d520 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65     /* Adjust the
1d530 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1d540 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77  t rows and downw
1d550 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72  ard to reflect r
1d560 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ows.    ** that 
1d570 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20  are excluded by 
1d580 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1d590 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  s..    */.    nR
1d5a0 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f  ow = (nRow * (do
1d5b0 75 62 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f  uble)estBound) /
1d5c0 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20   (double)100;.  
1d5d0 20 20 69 66 28 20 6e 52 6f 77 3c 31 20 29 20 6e    if( nRow<1 ) n
1d5e0 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  Row = 1;..    /*
1d5f0 20 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e   Experiments run
1d600 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20   on real SQLite 
1d610 64 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74  databases show t
1d620 68 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65  hat the time nee
1d630 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f  ded.    ** to do
1d640 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68   a binary search
1d650 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77   to locate a row
1d660 20 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69   in a table or i
1d670 6e 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a  ndex is roughly.
1d680 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20      ** log10(N) 
1d690 74 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74  times the time t
1d6a0 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20  o move from one 
1d6b0 72 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20  row to the next 
1d6c0 72 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  row within.    *
1d6d0 2a 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  * a table or ind
1d6e0 65 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  ex.  The actual 
1d6f0 74 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20  times can vary, 
1d700 77 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66  with the size of
1d710 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  .    ** records 
1d720 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61  being an importa
1d730 6e 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68  nt factor.  Both
1d740 20 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63   moves and searc
1d750 68 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73  hes are.    ** s
1d760 6c 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65  lower with large
1d770 72 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75  r records, presu
1d780 6d 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65  mably because fe
1d790 77 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a  wer records fit.
1d7a0 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61      ** on one pa
1d7b0 67 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72  ge and hence mor
1d7c0 65 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20  e pages have to 
1d7d0 62 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20  be fetched..    
1d7e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e  **.    ** The AN
1d7f0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e  ALYZE command an
1d800 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
1d810 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  t1 and sqlite_st
1d820 61 74 32 20 74 61 62 6c 65 73 20 64 6f 0a 20 20  at2 tables do.  
1d830 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73    ** not give us
1d840 20 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c   data on the rel
1d850 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74  ative sizes of t
1d860 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
1d870 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53  ecords..    ** S
1d880 6f 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69  o this computati
1d890 6f 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65  on assumes table
1d8a0 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f   records are abo
1d8b0 75 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a  ut twice as big.
1d8c0 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20      ** as index 
1d8d0 72 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20  records.    */. 
1d8e0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
1d8f0 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
1d900 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
1d910 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
1d920 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
1d930 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  an is a number o
1d940 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e  f move operation
1d950 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a  s equal.      **
1d960 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1d970 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1d980 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ble..      **.  
1d990 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e      ** We add an
1d9a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70   additional 4x p
1d9b0 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74  enalty to full t
1d9c0 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69  able scans.  Thi
1d9d0 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a  s causes.      *
1d9e0 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74  * the cost funct
1d9f0 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68  ion to err on th
1da00 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69  e side of choosi
1da10 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72  ng an index over
1da20 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69  .      ** choosi
1da30 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20  ng a full scan. 
1da40 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63   This 4x full-sc
1da50 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e  an penalty is an
1da60 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20   arguable.      
1da70 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20  ** decision and 
1da80 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78 70  one which we exp
1da90 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20 69  ect to revisit i
1daa0 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20 42  n the future.  B
1dab0 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73  ut.      ** it s
1dac0 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69  eems to be worki
1dad0 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61  ng well enough a
1dae0 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t the moment..  
1daf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73      */.      cos
1db00 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a  t = aiRowEst[0]*
1db10 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  4;.    }else{.  
1db20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74      log10N = est
1db30 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29  Log(aiRowEst[0])
1db40 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  ;.      cost = n
1db50 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
1db60 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Idx ){.        i
1db70 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20  f( bLookup ){.  
1db80 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
1db90 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66  n index lookup f
1dba0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62  ollowed by a tab
1dbb0 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20  le lookup:.     
1dbc0 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75       **    nInMu
1dbd0 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73  l index searches
1dbe0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61   to find the sta
1dbf0 72 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78  rt of each index
1dc00 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20   range.         
1dc10 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70   **  + nRow step
1dc20 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  s through the in
1dc30 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  dex.          **
1dc40 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73    + nRow table s
1dc50 65 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75  earches to looku
1dc60 70 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  p the table entr
1dc70 79 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69  y using the rowi
1dc80 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  d.          */. 
1dc90 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d           cost +=
1dca0 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77 29   (nInMul + nRow)
1dcb0 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20  *log10N;.       
1dcc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dcd0 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72    /* For a cover
1dce0 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20  ing index:.     
1dcf0 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d       **     nInM
1dd00 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
1dd10 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  s to find the in
1dd20 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  itial entry .   
1dd30 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52         **   + nR
1dd40 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1dd50 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1dd60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dd70 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c    cost += nInMul
1dd80 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20  *log10N;.       
1dd90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1dda0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
1ddb0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
1ddc0 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20  ey lookup:.     
1ddd0 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74     **    nInMult
1dde0 20 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20   table searches 
1ddf0 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74  to find the init
1de00 69 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61  ial entry for ea
1de10 63 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20  ch range.       
1de20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70   **  + nRow step
1de30 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 61  s through the ta
1de40 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ble.        */. 
1de50 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e         cost += n
1de60 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20  InMul*log10N;.  
1de70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1de80 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65   /* Add in the e
1de90 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
1dea0 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73   sorting the res
1deb0 75 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70  ult.  Actual exp
1dec0 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  erimental.    **
1ded0 20 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66   measurements of
1dee0 20 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d   sorting perform
1def0 61 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73  ance in SQLite s
1df00 68 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67  how that sorting
1df10 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64   time.    ** add
1df20 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74  s C*N*log10(N) t
1df30 6f 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72  o the cost, wher
1df40 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1df50 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20  r of rows to be 
1df60 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61  .    ** sorted a
1df70 6e 64 20 43 20 69 73 20 61 20 66 61 63 74 6f 72  nd C is a factor
1df80 20 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e   between 1.95 an
1df90 64 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20  d 4.3.  We will 
1dfa0 73 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  split the.    **
1dfb0 20 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20   difference and 
1dfc0 73 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e  select C of 3.0.
1dfd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1dfe0 62 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 63  bSort ){.      c
1dff0 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  ost += nRow*estL
1e000 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20  og(nRow)*3;.    
1e010 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74 20  }.    if( bDist 
1e020 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  ){.      cost +=
1e030 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
1e040 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  w)*3;.    }..   
1e050 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75   /**** Cost of u
1e060 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20  sing this index 
1e070 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d  has now been com
1e080 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20  puted ****/..   
1e090 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1e0a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73   additional cons
1e0b0 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20  traints on this 
1e0c0 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f  table that canno
1e0d0 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64  t.    ** be used
1e0e0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
1e0f0 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69  t index, but whi
1e100 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74  ch might lower t
1e110 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a  he number.    **
1e120 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c   of output rows,
1e130 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77   adjust the nRow
1e140 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67   value according
1e150 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a  ly.  This only .
1e160 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69      ** matters i
1e170 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  f the current in
1e180 64 65 78 20 69 73 20 74 68 65 20 6c 65 61 73 74  dex is the least
1e190 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e   costly, so do n
1e1a0 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ot bother.    **
1e1b0 20 77 69 74 68 20 74 68 69 73 20 73 74 65 70 20   with this step 
1e1c0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e  if we already kn
1e1d0 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20 77 69  ow this index wi
1e1e0 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e  ll not be chosen
1e1f0 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e  ..    ** Also, n
1e200 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 20  ever reduce the 
1e210 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74  output row count
1e220 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74   below 2 using t
1e230 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a  his step..    **
1e240 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72  .    ** It is cr
1e250 69 74 69 63 61 6c 20 74 68 61 74 20 74 68 65 20  itical that the 
1e260 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65  notValid mask be
1e270 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65   used here inste
1e280 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ad of.    ** the
1e290 20 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20   notReady mask. 
1e2a0 20 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   When computing 
1e2b0 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64  an "optimal" ind
1e2c0 65 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79  ex, the notReady
1e2d0 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c  .    ** mask wil
1e2e0 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20  l only have one 
1e2f0 62 69 74 20 73 65 74 20 2d 20 74 68 65 20 62 69  bit set - the bi
1e300 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
1e310 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  t table..    ** 
1e320 54 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73  The notValid mas
1e330 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  k, on the other 
1e340 68 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73  hand, always has
1e350 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f   all bits set fo
1e360 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  r.    ** tables 
1e370 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20  that are not in 
1e380 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66  outer loops.  If
1e390 20 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73 65   notReady is use
1e3a0 64 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20  d here instead. 
1e3b0 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69     ** of notVali
1e3c0 64 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61  d, then a optima
1e3d0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 64 65 70  l index that dep
1e3e0 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f  ends on inner jo
1e3f0 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a  ins loops.    **
1e400 20 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63 74   might be select
1e410 65 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ed even when the
1e420 72 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74  re exists an opt
1e430 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
1e440 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75  has.    ** no su
1e450 63 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20  ch dependency.. 
1e460 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1e470 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70 43  ow>2 && cost<=pC
1e480 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
1e490 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1e4c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53   */.      int nS
1e4d0 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20 20 20 20  kipEq = nEq;    
1e4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e4f0 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e   of == constrain
1e500 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ts to skip */.  
1e510 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e      int nSkipRan
1e520 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20  ge = nBound;    
1e530 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20   /* Number of < 
1e540 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73  constraints to s
1e550 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74  kip */.      Bit
1e560 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20  mask thisTab;   
1e570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
1e580 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a  map for pSrc */.
1e590 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20 3d  .      thisTab =
1e5a0 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
1e5b0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
1e5c0 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
1e5d0 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54  WC->a, k=pWC->nT
1e5e0 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b  erm; nRow>2 && k
1e5f0 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
1e600 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
1e610 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1e620 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e  RM_VIRTUAL ) con
1e630 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1e640 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
1e650 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29  qAll & notValid)
1e660 21 3d 74 68 69 73 54 61 62 20 29 20 63 6f 6e 74  !=thisTab ) cont
1e670 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e680 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1e690 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1e6a0 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a  N|WO_ISNULL) ){.
1e6b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
1e6c0 6b 69 70 45 71 20 29 7b 0a 20 20 20 20 20 20 20  kipEq ){.       
1e6d0 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74       /* Ignore t
1e6e0 68 65 20 66 69 72 73 74 20 6e 45 71 20 65 71 75  he first nEq equ
1e6f0 61 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73 69  ality matches si
1e700 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20  nce the index.  
1e710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
1e720 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74   already account
1e730 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a  ed for these */.
1e740 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69              nSki
1e750 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  pEq--;.         
1e760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e770 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61      /* Assume ea
1e780 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71  ch additional eq
1e790 75 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64  uality match red
1e7a0 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  uces the result.
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1e7c0 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63  et size by a fac
1e7d0 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20  tor of 10 */.   
1e7e0 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d           nRow /=
1e7f0 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
1e800 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e810 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1e820 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
1e830 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20  LE|WO_GT|WO_GE) 
1e840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e850 20 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20   nSkipRange ){. 
1e860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
1e870 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e  nore the first n
1e880 53 6b 69 70 52 61 6e 67 65 20 72 61 6e 67 65 20  SkipRange range 
1e890 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63  constraints sinc
1e8a0 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  e the index.    
1e8b0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
1e8c0 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64  lready accounted
1e8d0 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20   for these */.  
1e8e0 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52            nSkipR
1e8f0 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  ange--;.        
1e900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e910 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65       /* Assume e
1e920 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72  ach additional r
1e930 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1e940 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
1e950 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
1e960 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
1e970 66 61 63 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e  factor of 3.  In
1e980 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73  dexed range cons
1e990 74 72 61 69 6e 74 73 20 72 65 64 75 63 65 0a 20  traints reduce. 
1e9a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1e9b0 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
1e9c0 79 20 61 20 6c 61 72 67 65 72 20 66 61 63 74 6f  y a larger facto
1e9d0 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65 20 69  r: 4.  We make i
1e9e0 6e 64 65 78 65 64 20 72 61 6e 67 65 0a 20 20 20  ndexed range.   
1e9f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65           ** more
1ea00 20 73 65 6c 65 63 74 69 76 65 20 69 6e 74 65 6e   selective inten
1ea10 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75 73 65  tionally because
1ea20 20 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74 69   of the subjecti
1ea30 76 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ve .            
1ea40 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 74  ** observation t
1ea50 68 61 74 20 69 6e 64 65 78 65 64 20 72 61 6e 67  hat indexed rang
1ea60 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
1ea70 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a 20 20  ally are more.  
1ea80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 6c            ** sel
1ea90 65 63 74 69 76 65 20 69 6e 20 70 72 61 63 74 69  ective in practi
1eaa0 63 65 2c 20 6f 6e 20 61 76 65 72 61 67 65 2e 20  ce, on average. 
1eab0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1eac0 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  Row /= 3;.      
1ead0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1eae0 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
1eaf0 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f  Operator!=WO_NOO
1eb00 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  P ){.          /
1eb10 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  * Any other expr
1eb20 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68  ession lowers th
1eb30 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75  e output row cou
1eb40 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20  nt by half */.  
1eb50 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20          nRow /= 
1eb60 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
1eb70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1eb80 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32  Row<2 ) nRow = 2
1eb90 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48  ;.    }...    WH
1eba0 45 52 45 54 52 41 43 45 28 28 0a 20 20 20 20 20  ERETRACE((.     
1ebb0 20 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25 64   "%s(%s): nEq=%d
1ebc0 20 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74 42 6f   nInMul=%d estBo
1ebd0 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20  und=%d bSort=%d 
1ebe0 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61  bLookup=%d wsFla
1ebf0 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20 20  gs=0x%x\n".     
1ec00 20 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65   "         notRe
1ec10 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30  ady=0x%llx log10
1ec20 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66  N=%.1f nRow=%.1f
1ec30 20 63 6f 73 74 3d 25 2e 31 66 20 75 73 65 64 3d   cost=%.1f used=
1ec40 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20  0x%llx\n",.     
1ec50 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
1ec60 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78  me, (pIdx ? pIdx
1ec70 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29  ->zName : "ipk")
1ec80 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49  , .      nEq, nI
1ec90 6e 4d 75 6c 2c 20 65 73 74 42 6f 75 6e 64 2c 20  nMul, estBound, 
1eca0 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20  bSort, bLookup, 
1ecb0 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e  wsFlags,.      n
1ecc0 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c  otReady, log10N,
1ecd0 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65   nRow, cost, use
1ece0 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f  d.    ));..    /
1ecf0 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1ed00 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68  is the best we h
1ed10 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c  ave seen so far,
1ed20 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69   then record thi
1ed30 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61  s.    ** index a
1ed40 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74  nd its cost in t
1ed50 68 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75  he pCost structu
1ed60 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1ed70 66 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46  f( (!pIdx || wsF
1ed80 6c 61 67 73 29 0a 20 20 20 20 20 26 26 20 28 63  lags).     && (c
1ed90 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  ost<pCost->rCost
1eda0 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74   || (cost<=pCost
1edb0 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c  ->rCost && nRow<
1edc0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  pCost->plan.nRow
1edd0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1ede0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63  pCost->rCost = c
1edf0 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  ost;.      pCost
1ee00 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20  ->used = used;. 
1ee10 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1ee20 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  .nRow = nRow;.  
1ee30 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1ee40 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
1ee50 67 73 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a  gs&wsFlagMask);.
1ee60 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1ee70 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  n.nEq = nEq;.   
1ee80 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
1ee90 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
1eea0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1eeb0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
1eec0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1eed0 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
1eee0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
1eef0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
1ef00 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
1ef10 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a  Index ) break;..
1ef20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73      /* Reset mas
1ef30 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ks for the next 
1ef40 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f  index in the loo
1ef50 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d  p */.    wsFlagM
1ef60 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f  ask = ~(WHERE_RO
1ef70 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
1ef80 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65  ID_RANGE);.    e
1ef90 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45  qTermMask = idxE
1efa0 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a  qTermMask;.  }..
1efb0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1efc0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
1efd0 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49  use and the SQLI
1efe0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1eff0 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1f000 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20 74  , then reverse t
1f010 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  he order that th
1f020 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  e index will be 
1f030 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e  scanned.  ** in.
1f040 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
1f050 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65  r application te
1f060 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66  sting, to help f
1f070 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77  ind cases.  ** w
1f080 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e  here application
1f090 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e   behaviour depen
1f0a0 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66  ds on the (undef
1f0b0 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61 74  ined) order that
1f0c0 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74  .  ** SQLite out
1f0d0 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20  puts rows in in 
1f0e0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61  the absence of a
1f0f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f100 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f  e.  */.  if( !pO
1f110 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65  rderBy && pParse
1f120 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f130 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
1f140 72 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  r ){.    pCost->
1f150 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1f160 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
1f170 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f   }..  assert( pO
1f180 72 64 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74  rderBy || (pCost
1f190 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1f1a0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30  HERE_ORDERBY)==0
1f1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f1c0 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1f1d0 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70  ==0 || (pCost->p
1f1e0 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
1f1f0 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29  E_ROWID_EQ)==0 )
1f200 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1f210 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20  ->pIndex==0 .   
1f220 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c      || pCost->pl
1f230 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20  an.u.pIdx==0 .  
1f240 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70       || pCost->p
1f250 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63  lan.u.pIdx==pSrc
1f260 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a  ->pIndex .  );..
1f270 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
1f280 65 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73  est index is: %s
1f290 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70 43 6f 73  \n", .    ((pCos
1f2a0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1f2b0 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
1f2c0 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65  SCAN)==0 ? "none
1f2d0 22 20 3a 20 0a 20 20 20 20 20 20 20 20 20 70 43  " : .         pC
1f2e0 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1f2f0 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75   ? pCost->plan.u
1f300 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22  .pIdx->zName : "
1f310 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20  ipk").  ));.  . 
1f320 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
1f330 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1f340 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
1f350 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
1f360 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62 65  By, pCost);.  be
1f370 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
1f380 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1f390 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 43  rc, notReady, pC
1f3a0 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  ost);.  pCost->p
1f3b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
1f3c0 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  qTermMask;.}../*
1f3d0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
1f3e0 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
1f3f0 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
1f400 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
1f410 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
1f420 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
1f430 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
1f440 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
1f450 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
1f460 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
1f470 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1f480 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
1f490 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
1f4a0 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
1f4b0 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f   table scans..*/
1f4c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
1f4d0 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
1f4e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1f4f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1f500 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1f510 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1f520 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
1f530 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1f540 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1f550 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1f560 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
1f570 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
1f580 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
1f590 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
1f5a0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1f5b0 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   cursors not ava
1f5c0 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78  ilable for index
1f5d0 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
1f5e0 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20   notValid,      
1f5f0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
1f600 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
1f610 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f  r any purpose */
1f620 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1f630 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
1f640 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1f650 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
1f660 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
1f670 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
1f680 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
1f690 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
1f6a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1f6b0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
1f6c0 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54  Virtual(pSrc->pT
1f6d0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
1f6e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1f6f0 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69   = 0;.    bestVi
1f700 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
1f710 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
1f720 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64  tReady, notValid
1f730 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
1f740 74 2c 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70  t,&p);.    if( p
1f750 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1f760 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  tr ){.      sqli
1f770 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
1f780 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  tr);.    }.    s
1f790 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1f7a0 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  rse->db, p);.  }
1f7b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1f7c0 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
1f7d0 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1f7e0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
1f7f0 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
1f800 42 79 2c 20 30 2c 20 70 43 6f 73 74 29 3b 0a 20  By, 0, pCost);. 
1f810 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61   }.}../*.** Disa
1f820 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
1f830 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
1f840 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
1f850 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
1f860 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
1f870 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
1f880 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
1f890 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1f8a0 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
1f8b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
1f8c0 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
1f8d0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
1f8e0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
1f8f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
1f900 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
1f910 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f920 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1f930 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
1f940 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
1f950 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
1f960 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1f970 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1f980 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
1f990 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
1f9a0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
1f9b0 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
1f9c0 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
1f9d0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
1f9e0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
1f9f0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
1fa00 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
1fa10 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
1fa20 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
1fa30 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
1fa40 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
1fa50 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
1fa60 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1fa70 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
1fa80 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
1fa90 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  bled..**.** IMPL
1faa0 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1fab0 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20  -24597-58655 No 
1fac0 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66  tests are done f
1fad0 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  or terms that ar
1fae0 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e.** completely 
1faf0 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
1fb00 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ices..**.** Disa
1fb10 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
1fb20 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
1fb30 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
1fb40 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
1fb50 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
1fb60 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
1fb70 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1fb80 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
1fb90 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
1fba0 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
1fbb0 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
1fbc0 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
1fbd0 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
1fbe0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
1fbf0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
1fc00 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
1fc10 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
1fc20 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
1fc30 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
1fc40 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1fc50 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
1fc60 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
1fc70 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
1fc80 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
1fc90 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
1fca0 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
1fcb0 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
1fcc0 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
1fcd0 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
1fce0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
1fcf0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
1fd00 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1fd10 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
1fd20 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
1fd30 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
1fd40 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1fd50 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
1fd60 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
1fd70 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
1fd80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fd90 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
1fda0 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
1fdb0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
1fdc0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
1fdd0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1fde0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
1fdf0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1fe00 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
1fe10 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
1fe20 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
1fe30 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
1fe40 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
1fe50 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1fe60 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
1fe70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fe80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
1fe90 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
1fea0 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
1feb0 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
1fec0 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
1fed0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
1fee0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
1fef0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
1ff00 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
1ff10 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
1ff20 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
1ff30 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
1ff40 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
1ff50 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
1ff60 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
1ff70 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
1ff80 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
1ff90 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
1ffa0 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
1ffb0 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
1ffc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1ffd0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
1ffe0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
1fff0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
20000 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
20010 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
20020 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20030 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
20040 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
20050 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
20060 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
20070 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
20080 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
20090 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
200a0 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
200b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
200c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
200d0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
200e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
200f0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
20100 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
20110 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
20120 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
20130 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
20140 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
20150 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
20160 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
20170 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
20180 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
20190 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
201a0 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
201b0 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
201c0 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
201d0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
201e0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
201f0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
20200 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
20210 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
20220 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
20230 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
20240 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
20250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20260 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
20270 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
20280 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
20290 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
202a0 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
202b0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
202c0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
202d0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
202e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
202f0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
20300 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
20310 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
20320 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
20330 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
20340 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
20350 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
20360 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
20370 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
20380 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
20390 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
203a0 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
203b0 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
203c0 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
203d0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
203e0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
203f0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
20400 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
20410 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
20420 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
20430 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
20440 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
20450 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
20460 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
20470 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
20480 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
20490 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
204a0 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
204b0 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
204c0 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
204d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
204e0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
204f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
20500 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
20510 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
20520 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
20530 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
20540 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
20550 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
20560 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
20570 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
20580 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
20590 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
205a0 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
205b0 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
205c0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
205d0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
205e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
205f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
20600 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
20610 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
20620 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
20630 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
20640 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
20650 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
20660 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
20670 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
20680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
20690 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
206a0 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
206b0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
206c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
206d0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
206e0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
206f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20700 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
20710 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
20720 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
20740 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
20750 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
20760 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
20770 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
20780 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
20790 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
207a0 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
207b0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
207c0 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
207d0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
207e0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
207f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20800 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
20810 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
20820 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
20830 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
20840 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
20850 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
20860 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
20870 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
20880 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20890 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
208a0 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
208b0 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
208c0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
208d0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
208e0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
208f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
20900 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
20910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
20940 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
20950 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
20960 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
20970 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
20980 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
20990 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
209a0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
209b0 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
209c0 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
209d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
209e0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
209f0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
20a00 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
20a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20a20 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
20a30 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
20a40 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
20a50 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
20a60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
20a70 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
20a80 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
20a90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
20aa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
20ab0 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
20ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ad0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
20ae0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
20af0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
20b00 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
20b10 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
20b20 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
20b30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
20b40 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
20b50 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
20b60 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
20b70 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ** index..**.** 
20b80 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
20b90 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
20ba0 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
20bb0 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
20bc0 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
20bd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
20be0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
20bf0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
20c00 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
20c10 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
20c20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
20c30 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
20c40 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
20c50 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
20c60 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
20c70 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
20c80 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
20c90 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
20ca0 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
20cb0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
20cc0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
20cd0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
20ce0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
20cf0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
20d00 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
20d10 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
20d20 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
20d30 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
20d40 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
20d50 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
20d60 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
20d70 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
20d80 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
20d90 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
20da0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
20db0 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
20dc0 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
20dd0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
20de0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
20df0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
20e00 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
20e10 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
20e20 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
20e30 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
20e40 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
20e50 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
20e60 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
20e70 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
20e80 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
20e90 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
20ea0 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
20eb0 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
20ec0 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
20ed0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
20ee0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
20ef0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
20f00 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
20f10 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
20f20 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
20f30 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
20f40 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
20f50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
20f60 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
20f70 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
20f80 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
20f90 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
20fa0 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
20fb0 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
20fc0 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
20fd0 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
20fe0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
20ff0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
21000 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
21010 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
21020 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
21030 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
21040 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
21050 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
21060 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
21070 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
21080 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
21090 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
210a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
210b0 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
210c0 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
210d0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
210e0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
210f0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
21100 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
21110 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
21120 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
21130 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
21140 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
21150 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
21160 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
21170 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
21180 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
21190 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
211a0 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
211b0 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
211c0 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
211d0 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
211e0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
211f0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
21200 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
21210 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
21220 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
21230 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
21240 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
21250 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
21260 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
21270 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
21280 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
21290 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
212a0 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
212b0 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
212c0 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
212d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
212e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
212f0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
21300 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
21310 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
21320 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
21330 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
21340 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
21350 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
21360 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
21370 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
21380 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
21390 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
213a0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
213b0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
213c0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
213d0 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
213e0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
213f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
21400 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
21410 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
21420 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
21430 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
21440 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
21450 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
21460 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
21470 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
21480 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
21490 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20  el->plan.nEq;   
214a0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
214b0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
214c0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
214d0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
214e0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
214f0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
21500 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
21510 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
21540 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
21550 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
21560 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
21570 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65  TabCur;   /* The
21580 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
21590 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  able */.  WhereT
215a0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
215b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
215c0 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
215d0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  erm */.  int j; 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21600 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
21610 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
21620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
21630 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
21640 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21660 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
21670 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
21680 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
21690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
216a0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
216b0 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  string to return
216c0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
216d0 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
216e0 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
216f0 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
21700 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65  index. */.  asse
21710 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
21720 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
21730 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49  _INDEXED );.  pI
21740 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
21750 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20  n.u.pIdx;..  /* 
21760 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
21770 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
21780 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
21790 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
217a0 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
217b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
217c0 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
217d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
217e0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
217f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
21800 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
21810 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
21820 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
21830 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
21840 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
21850 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
21860 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
21870 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
21880 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
21890 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
218a0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
218b0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
218c0 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20  Column>=nEq );. 
218d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
218e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
218f0 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70  1;.    int k = p
21900 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
21910 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
21920 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
21930 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  , k, notReady, p
21940 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
21950 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ags, pIdx);.    
21960 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d  if( NEVER(pTerm=
21970 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
21980 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
21990 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
219a0 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
219b0 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
219c0 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
219d0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
219e0 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
219f0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
21a00 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
21a10 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
21a20 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21a30 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
21a40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
21a50 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
21a60 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
21a70 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
21a80 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f  2 */.    r1 = co
21a90 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
21aa0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
21ab0 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29  evel, regBase+j)
21ac0 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
21ad0 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
21ae0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
21af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21b00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21b10 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
21b20 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
21b30 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
21b40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21b60 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
21b70 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
21b80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
21b90 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
21ba0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
21bb0 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
21bc0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
21bd0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
21be0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
21bf0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
21c00 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
21c10 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
21c20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
21c30 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
21c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21c50 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
21c60 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
21c70 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
21c80 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66  drBrk);.      if
21c90 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
21ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
21cb0 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
21cc0 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
21cd0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
21ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
21cf0 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
21d00 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
21d20 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
21d30 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
21d40 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
21d50 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
21d60 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
21d70 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
21d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21d90 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
21da0 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
21db0 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
21dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
21dd0 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LAIN./*.** This 
21de0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c  routine is a hel
21df0 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e 49  per for explainI
21e00 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c 6f  ndexRange() belo
21e10 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c  w.**.** pStr hol
21e20 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  ds the text of a
21e30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
21e40 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  t we are buildin
21e50 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a  g up one term.**
21e60 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
21e70 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 61  s routine adds a
21e80 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
21e90 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70 72   end of the expr
21ea0 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73  ession..** Terms
21eb0 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62   are separated b
21ec0 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68 65  y AND so add the
21ed0 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72 20   "AND" text for 
21ee0 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
21ef0 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f  quent.** terms o
21f00 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nly..*/.static v
21f10 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65 6e  oid explainAppen
21f20 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63 75  dTerm(.  StrAccu
21f30 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  m *pStr,        
21f40 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
21f50 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e   expression bein
21f60 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74  g built */.  int
21f70 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   iTerm,         
21f80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21f90 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e 20  x of this term. 
21fa0 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 2a   First is zero *
21fb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21fc0 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  zColumn,        
21fd0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
21fe0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  olumn */.  const
21ff0 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20 20   char *zOp      
22000 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
22010 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  f the operator *
22020 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72 6d  /.){.  if( iTerm
22030 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
22040 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
22050 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73 71   AND ", 5);.  sq
22060 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22070 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  end(pStr, zColum
22080 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  n, -1);.  sqlite
22090 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
220a0 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20  pStr, zOp, 1);. 
220b0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
220c0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f 22  Append(pStr, "?"
220d0 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 1);.}../*.** A
220e0 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20 64  rgument pLevel d
220f0 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61 74  escribes a strat
22100 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  egy for scanning
22110 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68 69   table pTab. Thi
22120 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
22130 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
22140 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66   to a string buf
22150 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
22160 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20   description.** 
22170 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  of the subset of
22180 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61 6e   table rows scan
22190 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61 74  ned by the strat
221a0 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d 20  egy in the form 
221b0 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78 70  of an.** SQL exp
221c0 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66 20  ression. Or, if 
221d0 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63 61  all rows are sca
221e0 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nned, NULL is re
221f0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  turned..**.** Fo
22200 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
22210 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
22220 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
22230 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
22240 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75  b>2;.**.** is ru
22250 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61  n and there is a
22260 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62  n index on (a, b
22270 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
22280 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a  ction returns a.
22290 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c 61  ** string simila
222a0 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61  r to:.**.**   "a
222b0 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a  =? AND b>?".**.*
222c0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
222d0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
222e0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
222f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
22300 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
22310 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
22320 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
22330 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 62  er to free the b
22340 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69 73  uffer when it is
22350 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65  .** no longer re
22360 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
22370 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 49  c char *explainI
22380 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74 65  ndexRange(sqlite
22390 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 65 76 65  3 *db, WhereLeve
223a0 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c 65  l *pLevel, Table
223b0 20 2a 70 54 61 62 29 7b 0a 20 20 57 68 65 72 65   *pTab){.  Where
223c0 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26 70  Plan *pPlan = &p
223d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49  Level->plan;.  I
223e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
223f0 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20 20  Plan->u.pIdx;.  
22400 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e 2d  int nEq = pPlan-
22410 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  >nEq;.  int i, j
22420 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
22430 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20   = pTab->aCol;. 
22440 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d   int *aiColumn =
22450 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22460 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74 78  n;.  StrAccum tx
22470 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  t;..  if( nEq==0
22480 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46 6c   && (pPlan->wsFl
22490 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
224a0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
224b0 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a 20  _LIMIT))==0 ){. 
224c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
224d0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
224e0 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c 20  umInit(&txt, 0, 
224f0 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  0, SQLITE_MAX_LE
22500 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62 20  NGTH);.  txt.db 
22510 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  = db;.  sqlite3S
22520 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
22530 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20  xt, " (", 2);.  
22540 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20  for(i=0; i<nEq; 
22550 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  i++){.    explai
22560 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
22570 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  , i, aCol[aiColu
22580 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d  mn[i]].zName, "=
22590 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20 69  ");.  }..  j = i
225a0 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  ;.  if( pPlan->w
225b0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d  sFlags&WHERE_BTM
225c0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78  _LIMIT ){.    ex
225d0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
225e0 26 74 78 74 2c 20 69 2b 2b 2c 20 61 43 6f 6c 5b  &txt, i++, aCol[
225f0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
22600 6d 65 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20 20  me, ">");.  }.  
22610 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61  if( pPlan->wsFla
22620 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  gs&WHERE_TOP_LIM
22630 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  IT ){.    explai
22640 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
22650 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  , i, aCol[aiColu
22660 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3c  mn[j]].zName, "<
22670 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
22680 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
22690 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20  &txt, ")", 1);. 
226a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
226b0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74  trAccumFinish(&t
226c0 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
226d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
226e0 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
226f0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
22700 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
22710 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
22720 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72  and. If the quer
22730 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  y being compiled
22740 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51   is an EXPLAIN Q
22750 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e  UERY PLAN, a sin
22760 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73  gle.** record is
22770 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75   added to the ou
22780 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65  tput to describe
22790 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20   the table scan 
227a0 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20  strategy in .** 
227b0 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  pLevel..*/.stati
227c0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
227d0 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  eScan(.  Parse *
227e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
227f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
22800 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  e context */.  S
22810 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
22820 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22830 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69  * Table list thi
22840 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f  s loop refers to
22850 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
22860 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20   *pLevel,       
22870 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f        /* Scan to
22880 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69   write OP_Explai
22890 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a  n opcode for */.
228a0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
228d0 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66  level" column of
228e0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
228f0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22910 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22  Value for "from"
22920 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
22930 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  t */.  u16 wctrl
22940 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
22950 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
22960 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
22970 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
22980 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
22990 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
229a0 20 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d 20      u32 flags = 
229b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
229c0 6c 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63 74  lags;.    struct
229d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
229e0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
229f0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
22a00 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  m];.    Vdbe *v 
22a10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
22a20 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e        /* VM bein
22a30 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
22a40 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
22a50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
22a60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
22a70 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  andle */.    cha
22a80 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20  r *zMsg;        
22a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
22aa0 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50  xt to add to EQP
22ab0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 73   output */.    s
22ac0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f  qlite3_int64 nRo
22ad0 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
22ae0 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
22af0 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
22b00 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69  by scan */.    i
22b10 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d  nt iId = pParse-
22b20 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20  >iSelectId;  /* 
22b30 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d  Select id (left-
22b40 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75  most output colu
22b50 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn) */.    int i
22b60 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20  sSearch;        
22b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
22b80 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46   for a SEARCH. F
22b90 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a  alse for SCAN. *
22ba0 2f 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  /..    if( (flag
22bb0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
22bc0 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
22bd0 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
22be0 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
22bf0 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
22c00 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45  (pLevel->plan.nE
22c10 71 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  q>0).           
22c20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48 45    || (flags&(WHE
22c30 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
22c40 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
22c50 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
22c60 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57  | (wctrlFlags&(W
22c70 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
22c80 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
22c90 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20  AX));..    zMsg 
22ca0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
22cb0 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61  (db, "%s", isSea
22cc0 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43  rch?"SEARCH":"SC
22cd0 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49  AN");.    if( pI
22ce0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
22cf0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22d00 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
22d10 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55   zMsg, "%s SUBQU
22d20 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49  ERY %d", zMsg,pI
22d30 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  tem->iSelectId);
22d40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22d50 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22d60 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
22d70 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22  g, "%s TABLE %s"
22d80 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
22d90 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
22da0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
22db0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ias ){.      zMs
22dc0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22dd0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22de0 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  s AS %s", zMsg, 
22df0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
22e00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
22e10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
22e20 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
22e30 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
22e40 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
22e50 67 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70  ge(db, pLevel, p
22e60 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
22e70 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22e80 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
22e90 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25 73  sg, "%s USING %s
22ea0 25 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c 20  %sINDEX%s%s%s", 
22eb0 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  zMsg, .         
22ec0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
22ed0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55  _TEMP_INDEX)?"AU
22ee0 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a 20  TOMATIC ":""),. 
22ef0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
22f00 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
22f10 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a 22  Y)?"COVERING ":"
22f20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
22f30 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
22f40 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20 22  MP_INDEX)?"":" "
22f50 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  ),.          ((f
22f60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
22f70 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65  P_INDEX)?"": pLe
22f80 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
22f90 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
22fa0 20 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20      zWhere.     
22fb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22fc0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65  3DbFree(db, zWhe
22fd0 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  re);.    }else i
22fe0 66 28 20 66 6c 61 67 73 20 26 20 28 57 48 45 52  f( flags & (WHER
22ff0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
23000 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
23010 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
23020 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
23030 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e  , zMsg, "%s USIN
23040 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
23050 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a  Y KEY", zMsg);..
23060 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 26        if( flags&
23070 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
23080 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
23090 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
230a0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
230b0 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29  rowid=?)", zMsg)
230c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
230d0 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42  ( (flags&WHERE_B
230e0 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52  OTH_LIMIT)==WHER
230f0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a  E_BOTH_LIMIT ){.
23100 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
23110 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
23120 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
23130 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  wid>? AND rowid<
23140 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
23150 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
23160 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
23170 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
23180 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23190 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
231a0 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d  s (rowid>?)", zM
231b0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
231c0 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
231d0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
231e0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
231f0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
23200 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
23210 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
23220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
23230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23240 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
23250 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73   else if( (flags
23260 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
23270 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
23280 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
23290 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20  _info *pVtabIdx 
232a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
232b0 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20  .pVtabIdx;.     
232c0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
232d0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
232e0 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41  , "%s VIRTUAL TA
232f0 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
23300 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
23310 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
23320 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61  dx->idxNum, pVta
23330 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20  bIdx->idxStr);. 
23340 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23350 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28  if( wctrlFlags&(
23360 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
23370 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
23380 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65  MAX) ){.      te
23390 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
233a0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
233b0 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20  BY_MIN );.      
233c0 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65  nRow = 1;.    }e
233d0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  lse{.      nRow 
233e0 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
233f0 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52  )pLevel->plan.nR
23400 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ow;.    }.    zM
23410 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
23420 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
23430 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22  %s (~%lld rows)"
23440 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20  , zMsg, nRow);. 
23450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23460 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
23470 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c  in, iId, iLevel,
23480 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34   iFrom, zMsg, P4
23490 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
234a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
234b0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75  explainOneScan(u
234c0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
234d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
234e0 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f  T_EXPLAIN */.../
234f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23500 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  de for the start
23510 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74   of the iLevel-t
23520 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48  h loop in the WH
23530 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d  ERE clause.** im
23540 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73  plementation des
23550 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f  cribed by pWInfo
23560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
23570 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  ask codeOneLoopS
23580 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66  tart(.  WhereInf
23590 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20  o *pWInfo,   /* 
235a0 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61  Complete informa
235b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
235c0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
235d0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
235e0 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c        /* Which l
235f0 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e  evel of pWInfo->
23600 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  a[] should be co
23610 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ded */.  u16 wct
23620 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a  rlFlags,      /*
23630 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
23640 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
23650 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
23660 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
23670 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68  tReady     /* Wh
23680 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63  ich tables are c
23690 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
236a0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  le */.){.  int j
236b0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
236c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
236d0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20   */.  int iCur; 
236e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
236f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
23700 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
23710 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20   int addrNxt;   
23720 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
23730 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e  o jump to contin
23740 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
23750 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e   IN case */.  in
23760 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
23770 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
23780 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
23790 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  nly */.  int bRe
237a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
237b0 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
237c0 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
237d0 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57  rse order */.  W
237e0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
237f0 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65  l;  /* The where
23800 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64   level to be cod
23810 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
23820 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
23830 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
23840 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
23850 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
23860 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23880 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
23890 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
238a0 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
238b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
238c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
238d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
23900 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e  d stmt under con
23910 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
23920 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23930 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
23940 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  /* FROM clause t
23950 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20  erm being coded 
23960 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b  */.  int addrBrk
23970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23980 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
23990 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
239a0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
239b0 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
239e0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
239f0 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
23a00 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b  t iRowidReg = 0;
23a10 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
23a20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
23a30 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20  is register, if 
23a40 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e  not zero */.  in
23a50 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  t iReleaseReg = 
23a60 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  0;      /* Temp 
23a70 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
23a80 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
23a90 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  g */..  pParse =
23aa0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
23ab0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
23ac0 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57  Vdbe;.  pWC = pW
23ad0 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65  Info->pWC;.  pLe
23ae0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
23af0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62  [iLevel];.  pTab
23b00 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
23b10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
23b20 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
23b30 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
23b40 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d  Cursor;.  bRev =
23b50 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
23b60 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
23b70 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d  EVERSE)!=0;.  om
23b80 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
23b90 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
23ba0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
23bb0 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )!=0 .          
23bc0 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
23bd0 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  & WHERE_FORCE_TA
23be0 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43  BLE)==0;..  /* C
23bf0 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
23c00 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
23c10 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
23c20 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
23c30 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
23c40 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
23c50 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
23c60 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
23c70 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
23c80 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
23c90 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
23ca0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
23cb0 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
23cc0 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
23cd0 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
23ce0 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
23cf0 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
23d00 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
23d10 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
23d20 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
23d30 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
23d40 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
23d50 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
23d60 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
23d70 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
23d80 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
23d90 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
23da0 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
23db0 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
23dc0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
23dd0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
23de0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23df0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
23e00 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
23e10 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
23e20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
23e30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
23e40 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
23e50 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
23e60 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
23e70 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
23e80 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
23e90 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
23ea0 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
23eb0 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
23ec0 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
23ed0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
23ee0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
23ef0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
23f00 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
23f10 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
23f20 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
23f30 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
23f40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23f50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23f60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23f70 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
23f80 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
23f90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23fa0 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
23fb0 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
23fc0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
23fd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23fe0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20  UALTABLE.  if(  
23ff0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
24000 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
24010 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
24020 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a  {.    /* Case 0:
24030 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61    The table is a
24040 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20   virtual-table. 
24050 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72   Use the VFilter
24060 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a   and VNext.    *
24070 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63  *          to ac
24080 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20  cess the data.. 
24090 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52     */.    int iR
240a0 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75  eg;   /* P3 Valu
240b0 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  e for OP_VFilter
240c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
240d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61  index_info *pVta
240e0 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  bIdx = pLevel->p
240f0 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a  lan.u.pVtabIdx;.
24100 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
24110 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e  int = pVtabIdx->
24120 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20  nConstraint;.   
24130 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
24140 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
24150 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d  _usage *aUsage =
24160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
241a0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20  traintUsage;.   
241b0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
241c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
241d0 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
241e0 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
24220 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
24230 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24240 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
24250 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
24260 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
24270 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
24280 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a  nt+2);.    for(j
24290 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69  =1; j<=nConstrai
242a0 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
242b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
242c0 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
242d0 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
242e0 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
242f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
24300 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
24310 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66  raint[k].iTermOf
24320 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
24330 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24340 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69  pParse, pWC->a[i
24350 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69  Term].pExpr->pRi
24360 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a  ght, iReg+j+1);.
24370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
243a0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
243b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
243c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
243d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
243e0 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
243f0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
24400 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24410 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
24420 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
24430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24440 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
24450 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
24460 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e  iReg, pVtabIdx->
24470 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
24490 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
244a0 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
244b0 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
244c0 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78  C);.    pVtabIdx
244d0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
244e0 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  tr = 0;.    for(
244f0 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
24500 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
24510 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d  if( aUsage[j].om
24520 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  it ){.        in
24530 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
24540 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66  raint[j].iTermOf
24550 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69  fset;.        di
24560 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
24570 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  , &pWC->a[iTerm]
24580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24590 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
245a0 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
245b0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
245c0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
245d0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
245e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
245f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24600 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
24610 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
24620 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c  aint+2);.    sql
24630 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
24640 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d  (pParse, 1);.  }
24650 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
24660 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
24670 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
24680 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24690 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
246a0 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f  OWID_EQ ){.    /
246b0 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
246c0 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
246d0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
246e0 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  w using an.    *
246f0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
24700 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
24710 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
24720 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
24730 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72  **          we r
24740 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c  eference multipl
24750 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22  e rows using a "
24760 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a  rowid IN (...)".
24770 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
24780 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a  construct..    *
24790 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65  /.    iReleaseRe
247a0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
247b0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
247c0 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
247d0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
247e0 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
247f0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
24800 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
24810 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
24820 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
24830 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
24840 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
24850 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
24860 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
24870 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  e==0 );.    test
24880 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
24890 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
248a0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
248b0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
248c0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
248d0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
248e0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
248f0 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52  Level, iReleaseR
24900 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
24910 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
24920 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
24930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24940 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69  MustBeInt, iRowi
24950 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a  dReg, addrNxt);.
24960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24970 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
24980 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
24990 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
249a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
249b0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
249c0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
249d0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
249e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
249f0 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
24a00 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
24a10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
24a20 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24a30 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
24a40 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ANGE ){.    /* C
24a50 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
24a60 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
24a70 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
24a80 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
24a90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
24aa0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
24ab0 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
24ac0 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
24ad0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
24ae0 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
24af0 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
24b00 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
24b10 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74  =0 );.    pStart
24b20 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
24b30 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
24b40 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
24b50 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  , 0);.    pEnd =
24b60 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24b70 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
24b80 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
24b90 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  0);.    if( bRev
24ba0 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
24bb0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
24bc0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
24bd0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
24be0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
24bf0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
24c00 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
24c10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
24c20 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
24c30 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
24c40 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
24c50 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
24c60 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
24c70 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
24c80 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
24c90 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
24ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
24cb0 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
24cc0 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
24cd0 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
24ce0 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
24cf0 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
24d00 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
24d10 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
24d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
24d30 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
24d40 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
24d50 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
24d60 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
24d70 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
24d80 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
24d90 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
24da0 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
24db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
24dc0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
24dd0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
24de0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
24df0 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
24e00 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
24e10 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
24e20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
24e30 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
24e40 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
24e50 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
24e60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
24e70 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
24e80 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
24e90 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
24ea0 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
24eb0 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ( pStart->wtFlag
24ec0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24ed0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
24ee0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
24ef0 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70    pX = pStart->p
24f00 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
24f10 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
24f20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
24f30 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  t->leftCursor==i
24f40 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20  Cur );.      r1 
24f50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24f60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
24f70 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70  ->pRight, &rTemp
24f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24f90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d  VdbeAddOp3(v, aM
24fa0 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f  oveOp[pX->op-TK_
24fb0 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  GT], iCur, addrB
24fc0 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  rk, r1);.      V
24fd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
24fe0 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pk"));.      sql
24ff0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
25000 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
25010 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
25020 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25030 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
25040 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69  rTemp);.      di
25050 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
25060 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  , pStart);.    }
25070 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
25080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25090 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
250a0 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
250b0 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
250c0 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20   }.    if( pEnd 
250d0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
250e0 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45  X;.      pX = pE
250f0 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nd->pExpr;.     
25100 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
25110 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25120 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pEnd->leftCursor
25130 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
25140 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e  testcase( pEnd->
25150 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
25160 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
25170 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
25180 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61  /.      memEndVa
25190 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lue = ++pParse->
251a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
251b0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
251c0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
251d0 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20  memEndValue);.  
251e0 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
251f0 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
25200 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
25210 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
25220 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
25230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25240 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
25250 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
25260 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _Gt;.      }.   
25270 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
25280 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
25290 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20    }.    start = 
252a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
252b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70  ntAddr(v);.    p
252c0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
252d0 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
252e0 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
252f0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
25300 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
25310 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74  art;.    if( pSt
25320 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d  art==0 && pEnd==
25330 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
25340 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
25350 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
25360 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c  AN_STEP;.    }el
25370 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
25380 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20  ( pLevel->p5==0 
25390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
253a0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
253b0 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
253c0 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
253d0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
253e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
253f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
25410 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
25420 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
25430 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
25440 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
25450 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
25460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25470 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
25480 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
25490 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
254a0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
254b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
254c0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
254d0 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
254e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
254f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
25500 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
25510 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
25520 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
25530 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
25540 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61  /* Case 3: A sca
25550 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
25560 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25570 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
25580 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
25590 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
255a0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
255b0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
255c0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
255d0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
255e0 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
255f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
25600 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
25610 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
25620 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
25630 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25640 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
25650 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
25660 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
25670 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
25680 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
25690 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
256a0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
256b0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
256c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
256d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
256e0 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
256f0 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
25700 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
25710 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
25720 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
25730 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
25740 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
25750 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
25760 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
25770 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
25780 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
25790 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
257a0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
257b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
257c0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
257d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
257e0 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
257f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
25800 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
25810 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
25820 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
25830 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25840 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
25850 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
25860 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
25870 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
25880 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
25890 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
258a0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
258b0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
258c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
258d0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
258e0 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
258f0 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
25900 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
25910 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
25920 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
25930 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
25940 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
25950 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25960 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
25970 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
25980 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
25990 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
259a0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
259b0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
259c0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
259d0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
259e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
259f0 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
25a00 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
25a10 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
25a20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
25a30 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
25a40 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
25a50 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
25a60 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73  ..    */  .    s
25a70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
25a80 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20  StartOp[] = {.  
25a90 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a      0,.      0,.
25aa0 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c        OP_Rewind,
25ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
25ac0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
25ad0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
25ae0 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20  &&  !bRev) */.  
25af0 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20      OP_Last,    
25b00 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
25b10 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
25b20 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
25b30 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20     bRev) */.    
25b40 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20    OP_SeekGt,    
25b50 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74         /* 4: (st
25b60 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
25b70 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
25b80 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
25b90 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20  OP_SeekLt,      
25ba0 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72       /* 5: (star
25bb0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
25bc0 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62  & !startEq &&  b
25bd0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
25be0 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20  _SeekGe,        
25bf0 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f     /* 6: (start_
25c00 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
25c10 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65   startEq && !bRe
25c20 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
25c30 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20  eekLe           
25c40 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f   /* 7: (start_co
25c50 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
25c60 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
25c70 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73   */.    };.    s
25c80 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
25c90 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
25ca0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
25cb0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
25cc0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
25cd0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
25ce0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
25cf0 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
25d00 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
25d10 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d30 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
25d40 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
25d50 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
25d60 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
25d70 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65  n.nEq;  /* Numbe
25d80 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65  r of == or IN te
25d90 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rms */.    int i
25da0 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
25db0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
25dc0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
25dd0 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
25de0 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
25df0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
25e00 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
25e10 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
25e20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
25e30 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
25e60 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
25e70 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
25e80 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
25e90 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25ea0 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
25eb0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
25ec0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
25ed0 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
25ee0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
25ef0 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
25f00 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
25f30 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
25f40 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
25f50 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f70 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
25f80 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
25f90 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
25fa0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
25fb0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
25fc0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
25fd0 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
25fe0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
25ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26000 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
26010 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
26020 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
26050 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
26060 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
26070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26080 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
26090 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
260a0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
260b0 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20  xtraReg = 0;    
260c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
260d0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
260e0 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
260f0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26110 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
26120 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
26130 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20   *zStartAff;    
26140 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
26150 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f  nity for start o
26160 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
26170 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
26180 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20  zEndAff;        
26190 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
261a0 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61  ty for end of ra
261b0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
261c0 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  /..    pIdx = pL
261d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
261e0 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
261f0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
26200 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e  ;.    k = pIdx->
26210 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20  aiColumn[nEq];  
26220 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
26230 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
26240 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20  traints */..    
26250 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20  /* If this loop 
26260 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74  satisfies a sort
26270 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79   order (pOrderBy
26280 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a  ) request that .
26290 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65      ** was passe
262a0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
262b0 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  on to implement 
262c0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
262d0 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75   ..." .    ** qu
262e0 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ery, then the ca
262f0 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61  ller will only a
26300 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f  llow the loop to
26310 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20   run for.    ** 
26320 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69  a single iterati
26330 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  on. This means t
26340 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  hat the first ro
26350 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  w returned.    *
26360 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  * should not hav
26370 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73  e a NULL value s
26380 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66  tored in 'x'. If
26390 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20   column 'x' is. 
263a0 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
263b0 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45  one after the nE
263c0 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  q equality const
263d0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  raints in the in
263e0 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  dex,.    ** this
263f0 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
26400 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
26410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26420 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
26430 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d  E_ORDERBY_MIN)!=
26440 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  0.     && (pLeve
26450 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  l->plan.wsFlags&
26460 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20  WHERE_ORDERBY). 
26470 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
26480 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29  olumn>nEq).    )
26490 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
264a0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
264b0 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  pr==1 ); */.    
264c0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
264d0 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70  derBy->a[0].pExp
264e0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  r->iColumn==pIdx
264f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20  ->aiColumn[nEq] 
26500 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69  ); */.      isMi
26510 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  nQuery = 1;.    
26520 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
26530 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
26540 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
26550 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
26560 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
26570 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a  t and end .    *
26580 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  * of the range. 
26590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
265a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
265b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
265c0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
265d0 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64  pRangeEnd = find
265e0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
265f0 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f  k, notReady, (WO
26600 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78  _LT|WO_LE), pIdx
26610 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  );.      nExtraR
26620 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  eg = 1;.    }.  
26630 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
26640 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
26650 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
26660 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72        pRangeStar
26670 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
26680 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
26690 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  ady, (WO_GT|WO_G
266a0 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
266b0 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
266c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
266d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
266e0 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
266f0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
26700 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
26710 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
26720 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
26730 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72   terms in an arr
26740 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
26750 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
26760 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20  at regBase..    
26770 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  */.    regBase =
26780 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
26790 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70  Terms(.        p
267a0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70  Parse, pLevel, p
267b0 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45  WC, notReady, nE
267c0 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74  xtraReg, &zStart
267d0 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a  Aff.    );.    z
267e0 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33  EndAff = sqlite3
267f0 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
26800 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
26810 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
26820 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
26830 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
26840 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
26850 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
26860 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
26870 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
26880 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
26890 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
268a0 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
268b0 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
268c0 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
268d0 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
268e0 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
268f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
26900 28 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c  ( nEq<pIdx->nCol
26910 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49  umn && bRev==(pI
26920 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
26930 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
26940 53 43 29 20 29 7b 0a 20 20 20 20 20 20 53 57 41  SC) ){.      SWA
26950 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70  P(WhereTerm *, p
26960 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65  RangeEnd, pRange
26970 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  Start);.    }.. 
26980 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26990 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
269a0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
269b0 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
269c0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
269d0 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
269e0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
269f0 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
26a00 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
26a10 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
26a20 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
26a30 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_LE );.    test
26a40 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
26a50 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
26a60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
26a70 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d  );.    startEq =
26a80 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c   !pRangeStart ||
26a90 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
26aa0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
26ab0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64  |WO_GE);.    end
26ac0 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e  Eq =   !pRangeEn
26ad0 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d || pRangeEnd->
26ae0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
26af0 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73  LE|WO_GE);.    s
26b00 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
26b10 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
26b20 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a  | nEq>0;..    /*
26b30 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20   Seek the index 
26b40 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74  cursor to the st
26b50 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
26b60 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72  . */.    nConstr
26b70 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
26b80 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  if( pRangeStart 
26b90 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
26ba0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74  Right = pRangeSt
26bb0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
26bc0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
26bd0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
26be0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
26bf0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
26c00 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  ( (pRangeStart->
26c10 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
26c20 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
26c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26c40 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
26c50 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
26c60 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
26c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26c80 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a 20  ( zStartAff ){. 
26c90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
26ca0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
26cb0 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  y(pRight, zStart
26cc0 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
26cd0 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
26ce0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
26cf0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
26d00 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
26d10 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
26d20 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
26d30 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
26d40 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
26d50 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
26d60 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
26d70 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
26d80 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
26d90 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26da0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
26db0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
26dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26dd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
26de0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
26df0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
26e00 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
26e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
26e20 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53  tartAff[nEq] = S
26e30 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
26e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e50 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
26e60 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
26e70 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
26e80 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
26e90 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
26ea0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
26eb0 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  1662 */.    }els
26ec0 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
26ed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26ee0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26ef0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
26f00 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
26f10 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
26f20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
26f30 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
26f40 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
26f50 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
26f60 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
26f70 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
26f80 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41 66  traint, zStartAf
26f90 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53 74  f);.    op = aSt
26fa0 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e  artOp[(start_con
26fb0 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28  straints<<2) + (
26fc0 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52  startEq<<1) + bR
26fd0 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ev];.    assert(
26fe0 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74 65   op!=0 );.    te
26ff0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 52  stcase( op==OP_R
27000 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65 73  ewind );.    tes
27010 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61  tcase( op==OP_La
27020 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
27030 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
27040 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
27050 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 65  e( op==OP_SeekGe
27060 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
27070 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20  ( op==OP_SeekLe 
27080 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
27090 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 29   op==OP_SeekLt )
270a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
270b0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
270c0 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
270d0 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
270e0 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20 20  nstraint);..    
270f0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  /* Load the valu
27100 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61  e for the inequa
27110 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
27120 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
27130 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28  e.    ** range (
27140 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
27150 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
27160 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
27170 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
27180 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
27190 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70   pRangeEnd->pExp
271a0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
271b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
271c0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
271d0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b  regBase+nEq, 1);
271e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
271f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
27200 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
27210 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
27220 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
27230 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
27240 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
27250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
27260 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
27270 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
27280 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
27290 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e   }.      if( zEn
272a0 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dAff ){.        
272b0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
272c0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
272d0 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29  t, zEndAff[nEq])
272e0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
272f0 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
27300 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
27310 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
27320 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
27330 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
27340 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
27350 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
27360 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
27370 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
27380 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
27390 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
273a0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
273b0 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
273c0 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
273d0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
273e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
273f0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
27400 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
27410 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
27420 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
27430 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
27440 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
27450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27460 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41   }  .      codeA
27470 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
27480 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
27490 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20  q+1, zEndAff);. 
274a0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
274b0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
274c0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
274d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
274e0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
274f0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
27500 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27510 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
27520 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b  >db, zStartAff);
27530 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
27540 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
27550 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  EndAff);..    /*
27560 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
27570 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
27580 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
27590 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
275a0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
275b0 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
275c0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
275d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
275e0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
275f0 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
27600 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
27610 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
27620 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
27630 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
27640 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
27650 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
27660 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
27670 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
27680 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
27690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
276a0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
276b0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
276c0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
276d0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
276e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
276f0 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
27700 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
27710 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
27720 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
27730 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
27740 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
27750 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
27760 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
27770 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
27780 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
27790 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
277a0 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
277b0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
277c0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
277d0 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
277e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
277f0 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
27800 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
27810 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27820 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_BTM_LIMIT );. 
27830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
27840 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
27850 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
27860 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 28  MIT );.    if( (
27870 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27880 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
27890 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
278a0 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b 0a  P_LIMIT))!=0 ){.
278b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
278c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
278d0 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
278e0 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
278f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27900 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
27910 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
27920 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
27930 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27940 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
27950 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
27960 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
27970 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
27980 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
27990 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
279a0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
279b0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
279c0 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74  );.    if( !omit
279d0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
279e0 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
279f0 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
27a00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
27a10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
27a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27a30 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
27a40 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
27a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27a60 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
27a70 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
27a80 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
27a90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27aa0 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
27ab0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
27ac0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
27ad0 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ek */.    }..   
27ae0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
27af0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
27b00 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
27b10 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
27b20 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
27b30 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
27b40 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
27b50 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
27b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27b70 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
27b80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
27b90 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70 4c  IQUE ){.      pL
27ba0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
27bb0 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
27bc0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
27bd0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
27be0 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
27bf0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
27c00 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
27c10 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70   }.    pLevel->p
27c20 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d  1 = iIdxCur;.  }
27c30 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
27c40 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
27c50 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
27c60 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27c70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
27c80 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
27c90 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20  Case 4:  Two or 
27ca0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
27cb0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
27cc0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
27cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
27ce0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
27cf0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
27d00 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
27d10 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
27d20 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
27d30 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
27d40 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
27d50 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
27d60 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
27d70 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
27d80 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
27d90 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
27da0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
27db0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
27dc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
27dd0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
27de0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
27df0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
27e00 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
27e10 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
27e20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
27e30 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
27e40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
27e50 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
27e60 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
27e70 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
27e80 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
27e90 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
27ea0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
27eb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
27ec0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
27ed0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
27ee0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
27ef0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
27f00 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
27f10 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
27f20 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
27f30 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
27f40 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
27f50 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
27f60 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
27f70 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
27f80 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
27f90 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
27fa0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
27fb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
27fc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
27fd0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
27fe0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
27ff0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
28000 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
28010 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
28020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
28030 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
28040 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
28050 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
28060 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
28070 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
28080 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
28090 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
280a0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
280b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
280c0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
280d0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
280e0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
280f0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
28100 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
28110 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
28130 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
28140 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
28150 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
28160 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
28170 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
28180 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
28190 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
281a0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
281c0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
281d0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
281e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
281f0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
28200 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
28210 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
28220 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
28230 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
28240 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
28250 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
28260 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
28270 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
28280 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
28290 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
282a0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
282b0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
282c0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
282d0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
282e0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
282f0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
28300 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
28310 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
28320 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
28330 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
28340 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
28350 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28370 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
28380 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
28390 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
283a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283c0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
283d0 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
283e0 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
283f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28400 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
28410 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
28420 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
28430 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
28460 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
28470 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
28480 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
28490 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
284a0 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
284b0 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
284c0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a 20 20    int ii;.   .  
284d0 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
284e0 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
284f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
28500 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
28510 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
28520 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20  ator==WO_OR );. 
28530 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
28540 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
28550 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
28560 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
28570 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
28580 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  c;.    pLevel->o
28590 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
285a0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
285b0 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20  regReturn;..    
285c0 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20  /* Set up a new 
285d0 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61  SrcList ni pOrTa
285e0 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  b containing the
285f0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61   table being sca
28600 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  nned.    ** by t
28610 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  his loop in the 
28620 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c  a[0] slot and al
28630 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  l notReady table
28640 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74  s in a[1..] slot
28650 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  s..    ** This b
28660 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69  ecomes the SrcLi
28670 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  st in the recurs
28680 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ive call to sqli
28690 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
286a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
286b0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
286c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
286d0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
286e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
286f0 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61  number of notRea
28700 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  dy tables */.   
28710 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
28720 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b  t_item *origSrc;
28730 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
28740 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   list of tables 
28750 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61  */.      nNotRea
28760 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  dy = pWInfo->nLe
28770 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31  vel - iLevel - 1
28780 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  ;.      pOrTab =
28790 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c   sqlite3StackAll
287a0 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
287b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
287d0 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e  zeof(*pOrTab)+ n
287e0 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28  NotReady*sizeof(
287f0 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a  pOrTab->a[0]));.
28800 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62        if( pOrTab
28810 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74  ==0 ) return not
28820 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72  Ready;.      pOr
28830 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69  Tab->nAlloc = (i
28840 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  16)(nNotReady + 
28850 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
28860 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
28870 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
28880 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
28890 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
288a0 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
288b0 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
288c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
288d0 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
288e0 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
288f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
28900 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
28910 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
28920 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
28930 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
28940 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
28950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28960 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
28970 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
28980 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
28990 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
289a0 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
289b0 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
289c0 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
289d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
289e0 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
289f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
28a00 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
28a10 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
28a20 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
28a30 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
28a40 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
28a50 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
28a60 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
28a70 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
28a80 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
28a90 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
28aa0 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
28ab0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
28ac0 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
28ad0 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
28ae0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
28af0 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
28b00 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
28b10 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
28b20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
28b30 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
28b40 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
28b50 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
28b60 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
28b70 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
28b80 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
28b90 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
28ba0 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
28bb0 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
28bc0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
28bd0 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
28be0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
28bf0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
28c00 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
28c10 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
28c20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
28c30 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
28c40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
28c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
28c70 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
28c80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  t);.    }.    iR
28c90 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
28ca0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28cb0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
28cc0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f  Return);..    fo
28cd0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
28ce0 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
28cf0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
28d00 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
28d10 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
28d20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
28d30 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
28d40 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
28d50 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20  tor==WO_AND ){. 
28d60 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f         WhereInfo
28d70 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20   *pSubWInfo;    
28d80 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
28d90 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
28da0 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
28db0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
28dc0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
28dd0 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
28de0 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
28df0 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
28e00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28e10 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c  (pParse, pOrTab,
28e20 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
28e30 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
28e50 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c  HERE_OMIT_OPEN |
28e60 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53   WHERE_OMIT_CLOS
28e70 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
28e80 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
28e90 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
28ea0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
28eb0 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66  NLY);.        if
28ec0 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
28ed0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
28ee0 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
28ef0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
28f00 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66  OrTab, &pSubWInf
28f10 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c  o->a[0], iLevel,
28f20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
28f30 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  0.          );. 
28f40 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
28f50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28f60 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
28f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28f80 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
28f90 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
28fa0 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
28fb0 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
28fc0 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
28fd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
28fe0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
28ff0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d  TabItem->pTab, -
29000 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20  1, iCur, .      
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20     regRowid);.  
29040 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29050 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
29060 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c  , OP_RowSetTest,
29070 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20   regRowset,.    
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
290a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
290b0 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65  ddr(v)+2, r, iSe
290c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
290d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
290e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
290f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75  P_Gosub, regRetu
29100 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a  rn, iLoopBody);.
29110 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29120 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
29130 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
29140 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
29150 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
29160 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
29170 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
29180 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
29190 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
291a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
291b0 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
291c0 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
291d0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
291e0 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
291f0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
29200 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
29210 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29220 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
29230 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
29240 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
29250 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
29260 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
29270 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
29280 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
29290 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
292a0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
292b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
292c0 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
292d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
292e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
292f0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
29300 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65  iRetInit, sqlite
29310 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
29320 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
29330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29340 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65  P_Goto, 0, pLeve
29350 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
29360 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29370 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f  lveLabel(v, iLoo
29380 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28  pBody);..    if(
29390 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
293a0 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b  1 ) sqlite3Stack
293b0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
293c0 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66   pOrTab);.    if
293d0 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73  ( !untestedTerms
293e0 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70   ) disableTerm(p
293f0 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
29400 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
29410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
29420 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
29430 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  .  {.    /* Case
29440 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f   5:  There is no
29450 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20   usable index.  
29460 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d  We must do a com
29470 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  plete.    **    
29480 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
29490 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
294a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
294b0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70  c const u8 aStep
294c0 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20  [] = { OP_Next, 
294d0 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73  OP_Prev };.    s
294e0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
294f0 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52  Start[] = { OP_R
29500 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d  ewind, OP_Last }
29510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52  ;.    assert( bR
29520 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31  ev==0 || bRev==1
29530 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29540 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
29550 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
29560 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20   aStep[bRev];.  
29570 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
29580 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
29590 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
295a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
295b0 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
295c0 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
295d0 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
295e0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
295f0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
29600 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d   }.  notReady &=
29610 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70   ~getMask(pWC->p
29620 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
29630 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
29640 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
29650 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
29660 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
29670 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  tely.  ** comput
29680 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
29690 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
296a0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  es..  **.  ** IM
296b0 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
296c0 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54   R-49525-50935 T
296d0 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  erms that cannot
296e0 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74 68   be satisfied th
296f0 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75  rough.  ** the u
29700 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65  se of indices be
29710 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74 20  come tests that 
29720 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 67  are evaluated ag
29730 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f  ainst each row o
29740 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76  f.  ** the relev
29750 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73  ant input tables
29760 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65  ..  */.  for(pTe
29770 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
29780 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
29790 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
297a0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
297b0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
297c0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
297d0 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50  IRTUAL ); /* IMP
297e0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
297f0 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
29800 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
29810 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
29820 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
29830 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
29840 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
29850 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
29860 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
29870 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
29880 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
29890 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66   testcase( pWInf
298a0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
298b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
298c0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
298d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
298e0 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
298f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49  !=0 );.      pWI
29900 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
29910 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  ms = 1;.      co
29920 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
29930 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
29940 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
29950 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pE!=0 );.    if
29960 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
29970 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
29980 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
29990 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
299a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
299b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
299c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
299d0 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53   pE, addrCont, S
299e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
299f0 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  );.    pTerm->wt
29a00 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
29a10 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  DED;.  }..  /* F
29a20 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
29a30 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
29a40 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
29a50 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
29a60 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
29a70 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
29a80 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
29a90 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
29aa0 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
29ab0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
29ac0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
29ad0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
29ae0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
29af0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
29b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29b10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
29b20 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
29b30 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
29b40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
29b50 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
29b60 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
29b70 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29b80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
29b90 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
29ba0 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
29bb0 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
29bc0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
29bd0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
29be0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
29bf0 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30  );  /* IMP: R-30
29c00 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
29c10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
29c20 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
29c30 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
29c40 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
29c50 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
29c60 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
29c70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29c80 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
29c90 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
29ca0 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
29cb0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
29cc0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
29cd0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
29ce0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
29cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
29d00 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
29d10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
29d20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
29d30 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43  rm->pExpr, addrC
29d40 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
29d50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
29d60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
29d70 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
29d80 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
29d90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
29da0 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
29db0 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e  eg);..  return n
29dc0 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20  otReady;.}..#if 
29dd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
29de0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  EST)./*.** The f
29df0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
29e00 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64  e holds a text d
29e10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75  escription of qu
29e20 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74  ery plan generat
29e30 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73  ed.** by the mos
29e40 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
29e50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29e60 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c  in().  Each call
29e70 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a   to WhereBegin.*
29e80 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
29e90 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73   previous.  This
29ea0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
29eb0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
29ec0 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73   and.** analysis
29ed0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73   only..*/.char s
29ee0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
29ef0 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a  n[BMS*2*40];  /*
29f00 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69   Text of the joi
29f10 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
29f20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20  nQPlan = 0;     
29f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
29f40 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71   free slow in _q
29f50 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a  uery_plan[] */..
29f60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
29f70 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
29f80 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
29f90 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
29fa0 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
29fb0 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
29fc0 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
29fd0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
29fe0 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
29ff0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2a000 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
2a010 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
2a020 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2a030 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
2a040 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
2a050 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
2a060 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
2a070 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
2a080 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
2a090 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
2a0a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a0b0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ); */.        if
2a0c0 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
2a0d0 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
2a0e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2a0f0 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
2a100 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
2a110 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2a120 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
2a130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a140 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  ( pWInfo->a[i].p
2a150 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2a160 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29  ERE_TEMP_INDEX )
2a170 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
2a180 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e  *pIdx = pWInfo->
2a190 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  a[i].plan.u.pIdx
2a1a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2a1b0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
2a1c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2a1d0 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29  , pIdx->zColAff)
2a1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2a1f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
2a200 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dx);.        }. 
2a210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a220 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
2a230 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a  r(pWInfo->pWC);.
2a240 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a250 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2a260 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
2a270 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
2a280 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
2a290 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
2a2a0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2a2b0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
2a2c0 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
2a2d0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
2a2e0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
2a2f0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
2a300 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
2a310 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
2a320 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
2a330 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2a340 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
2a350 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
2a360 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
2a370 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
2a380 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
2a390 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2a3a0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
2a3b0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
2a3c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2a3d0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
2a3e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
2a3f0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
2a400 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
2a410 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
2a420 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
2a430 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
2a440 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2a450 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
2a460 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2a470 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
2a480 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
2a490 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
2a4a0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
2a4b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a4c0 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
2a4d0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
2a4e0 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
2a4f0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
2a500 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
2a510 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
2a520 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
2a530 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
2a540 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
2a550 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2a560 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
2a570 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
2a580 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2a590 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2a5a0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
2a5b0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
2a5c0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2a5d0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
2a5e0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
2a5f0 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
2a600 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
2a610 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
2a640 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
2a650 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
2a670 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
2a680 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
2a690 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2a6a0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
2a6b0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2a6c0 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
2a6d0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
2a6e0 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
2a6f0 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
2a700 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a710 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
2a720 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
2a730 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
2a740 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
2a750 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
2a760 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
2a770 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
2a780 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
2a790 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
2a7a0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
2a7b0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
2a7c0 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
2a7d0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
2a7e0 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
2a7f0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
2a800 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
2a810 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
2a820 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
2a830 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
2a840 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
2a850 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
2a860 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
2a870 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
2a880 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
2a890 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
2a8a0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
2a8b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
2a8c0 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
2a8d0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
2a8e0 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
2a8f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
2a900 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
2a910 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
2a920 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
2a930 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
2a940 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
2a950 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
2a960 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
2a970 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
2a980 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
2a990 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
2a9a0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
2a9b0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
2a9c0 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
2a9d0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
2a9e0 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
2a9f0 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
2aa00 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
2aa10 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
2aa20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
2aa30 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2aa40 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
2aa50 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
2aa60 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
2aa70 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
2aa80 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
2aa90 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
2aaa0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
2aab0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
2aac0 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
2aad0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
2aae0 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
2aaf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2ab00 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
2ab10 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
2ab20 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
2ab30 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
2ab40 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
2ab50 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
2ab60 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
2ab70 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
2ab80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
2ab90 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
2aba0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
2abb0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
2abc0 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
2abd0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
2abe0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
2abf0 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
2ac00 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
2ac10 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
2ac20 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
2ac30 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
2ac40 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
2ac50 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
2ac60 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
2ac70 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
2ac80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2ac90 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
2aca0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
2acb0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
2acc0 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
2acd0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
2ace0 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
2acf0 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
2ad00 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
2ad10 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
2ad20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
2ad30 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
2ad40 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
2ad50 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
2ad60 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
2ad70 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
2ad80 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
2ad90 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
2ada0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
2adb0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
2adc0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
2add0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
2ade0 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
2adf0 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
2ae00 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
2ae10 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
2ae20 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
2ae30 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
2ae40 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
2ae50 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
2ae60 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
2ae70 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
2ae80 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
2ae90 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
2aea0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
2aeb0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
2aec0 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
2aed0 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64  ING.**.** *ppOrd
2aee0 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
2aef0 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
2af00 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
2af10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
2af20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
2af30 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
2af40 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
2af50 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
2af60 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
2af70 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
2af80 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
2af90 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f  tement, then ppO
2afa0 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
2afb0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65  **.** If an inde
2afc0 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f  x can be used so
2afd0 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61   that the natura
2afe0 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f  l output order o
2aff0 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73  f the table.** s
2b000 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66  can is correct f
2b010 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
2b020 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61  clause, then tha
2b030 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  t index is used 
2b040 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  and.** *ppOrderB
2b050 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  y is set to NULL
2b060 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
2b070 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
2b080 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75  prevents an.** u
2b090 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20  nnecessary sort 
2b0a0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
2b0b0 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70  t if an index ap
2b0c0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
2b0d0 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
2b0e0 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69  ause already exi
2b0f0 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sts..**.** If th
2b100 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c  e where clause l
2b110 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61  oops cannot be a
2b120 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69  rranged to provi
2b130 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  de the correct.*
2b140 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20  * output order, 
2b150 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65  then the *ppOrde
2b160 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64  rBy is unchanged
2b170 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
2b180 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2b190 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
2b1a0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
2b1b0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2b1c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2b1d0 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41  TabList,    /* A
2b1e0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
2b1f0 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
2b200 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
2b210 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
2b220 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2b230 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2b240 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41  *ppOrderBy, /* A
2b250 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2b260 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
2b270 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
2b280 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c  nct,  /* The sel
2b290 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53  ect-list for DIS
2b2a0 54 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20  TINCT queries - 
2b2b0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
2b2c0 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
2b2d0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
2b2e0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
2b2f0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
2b300 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Int.h */.){.  in
2b310 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2b320 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2b330 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2b340 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
2b350 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
2b360 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
2b370 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
2b380 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
2b390 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
2b3a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b3b0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
2b3c0 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
2b3d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2b3e0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
2b3f0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
2b400 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
2b410 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
2b420 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2b430 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
2b440 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
2b450 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
2b460 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
2b470 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2b480 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
2b490 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
2b4a0 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2b4b0 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
2b4c0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2b4d0 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
2b4e0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b500 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
2b510 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2b520 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2b530 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
2b540 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
2b550 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
2b560 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
2b570 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2b580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b590 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
2b5a0 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
2b5b0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
2b5c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b5d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2b5e0 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
2b5f0 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
2b600 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
2b610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2b620 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
2b630 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
2b640 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
2b650 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2b660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b670 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2b680 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
2b690 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2b6a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b6b0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
2b6c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2b6d0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
2b6e0 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
2b6f0 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
2b700 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
2b710 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2b720 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
2b730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b740 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
2b750 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
2b760 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
2b770 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2b780 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2b790 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
2b7a0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
2b7b0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
2b7c0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
2b7d0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
2b7e0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2b7f0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c  NLY flag is set,
2b800 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a   then we should.
2b810 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61    ** only genera
2b820 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2b830 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70  first table in p
2b840 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75  TabList and assu
2b850 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79  me that.  ** any
2b860 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2b870 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75  ted with subsequ
2b880 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75  ent tables are u
2b890 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
2b8a0 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20  */.  nTabList = 
2b8b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2b8c0 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
2b8d0 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  Y) ? 1 : pTabLis
2b8e0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
2b8f0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2b900 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
2b910 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2b920 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
2b930 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
2b940 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
2b950 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
2b960 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2b970 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
2b980 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
2b990 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
2b9a0 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
2b9b0 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2b9c0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
2b9d0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
2b9e0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
2b9f0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
2ba00 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
2ba10 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
2ba20 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
2ba30 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
2ba40 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
2ba50 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
2ba60 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
2ba70 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
2ba80 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70  w..  */.  db = p
2ba90 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79  Parse->db;.  nBy
2baa0 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38  teWInfo = ROUND8
2bab0 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66  (sizeof(WhereInf
2bac0 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a  o)+(nTabList-1)*
2bad0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
2bae0 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  l));.  pWInfo = 
2baf0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2bb00 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e  ero(db, .      n
2bb10 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20  ByteWInfo + .   
2bb20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43     sizeof(WhereC
2bb30 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73  lause) +.      s
2bb40 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53  izeof(WhereMaskS
2bb50 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64  et).  );.  if( d
2bb60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bb70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2bb80 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2bb90 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30  ;.    pWInfo = 0
2bba0 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  ;.    goto where
2bbb0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
2bbc0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
2bbd0 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70   = nTabList;.  p
2bbe0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
2bbf0 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
2bc00 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
2bc10 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
2bc20 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
2bc30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2bc40 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43  );.  pWInfo->pWC
2bc50 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43   = pWC = (WhereC
2bc60 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
2bc70 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
2bc80 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
2bc90 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
2bca0 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
2bcb0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2bcc0 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
2bcd0 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53  ryLoop;.  pMaskS
2bce0 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
2bcf0 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20  et*)&pWC[1];..  
2bd00 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44  /* Disable the D
2bd10 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61  ISTINCT optimiza
2bd20 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44  tion if SQLITE_D
2bd30 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65  istinctOpt is se
2bd40 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74  t via.  ** sqlit
2bd50 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c  e3_test_ctrl(SQL
2bd60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2bd70 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20  IMIZATIONS,...) 
2bd80 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  */.  if( db->fla
2bd90 67 73 20 26 20 53 51 4c 49 54 45 5f 44 69 73 74  gs & SQLITE_Dist
2bda0 69 6e 63 74 4f 70 74 20 29 20 70 44 69 73 74 69  inctOpt ) pDisti
2bdb0 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  nct = 0;..  /* S
2bdc0 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
2bdd0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
2bde0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
2bdf0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
2be00 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
2be10 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
2be20 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2be30 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
2be40 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
2be50 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
2be60 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
2be70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
2be80 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
2be90 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
2bea0 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
2beb0 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
2bec0 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d  TK_AND);   /* IM
2bed0 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36  P: R-15842-53296
2bee0 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
2bef0 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
2bf00 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
2bf10 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
2bf20 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
2bf30 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
2bf40 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
2bf50 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
2bf60 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
2bf70 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
2bf80 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
2bf90 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
2bfa0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
2bfb0 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
2bfc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2bfd0 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
2bfe0 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
2bff0 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
2c000 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
2c010 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
2c020 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
2c030 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
2c040 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
2c050 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
2c060 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2c070 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
2c080 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
2c090 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
2c0a0 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
2c0b0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
2c0c0 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
2c0d0 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
2c0e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2c0f0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
2c100 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
2c110 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
2c120 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2c130 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
2c140 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
2c150 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
2c160 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
2c170 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
2c180 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
2c190 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2c1a0 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
2c1b0 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
2c1c0 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2c1d0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
2c1e0 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
2c1f0 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
2c200 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
2c210 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
2c220 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
2c230 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
2c240 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
2c250 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
2c260 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
2c270 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
2c280 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
2c290 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
2c2a0 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
2c2b0 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
2c2c0 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c 61  ure the WhereCla
2c2d0 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61 62  use.vmask variab
2c2e0 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73 20  le so that bits 
2c2f0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a  that correspond.
2c300 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c 20    ** to virtual 
2c310 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72  table cursors ar
2c320 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75  e set. This is u
2c330 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76 65  sed to selective
2c340 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a  ly disable .  **
2c350 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72   the OR-to-IN tr
2c360 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20  ansformation in 
2c370 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
2c380 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20 68  m(). It is not h
2c390 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74  elpful .  ** wit
2c3a0 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
2c3b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
2c3c0 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
2c3d0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2c3e0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
2c3f0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
2c400 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
2c410 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
2c420 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
2c430 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
2c440 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
2c450 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
2c460 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
2c470 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
2c480 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
2c490 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
2c4a0 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
2c4b0 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 76    assert( pWC->v
2c4c0 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b  mask==0 && pMask
2c4d0 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66  Set->n==0 );.  f
2c4e0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2c4f0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2c500 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
2c510 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
2c520 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
2c530 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c540 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2c550 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  LE.    if( ALWAY
2c560 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  S(pTabList->a[i]
2c570 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72 74  .pTab) && IsVirt
2c580 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ual(pTabList->a[
2c590 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  i].pTab) ){.    
2c5a0 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d 20    pWC->vmask |= 
2c5b0 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20 69  ((Bitmask)1 << i
2c5c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2c5d0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
2c5e0 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
2c5f0 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
2c600 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c610 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2c620 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74   i++){.      Bit
2c630 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
2c640 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2c650 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2c660 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
2c670 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
2c680 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
2c690 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
2c6a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c6b0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
2c6c0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
2c6d0 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
2c6e0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
2c6f0 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
2c700 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
2c710 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
2c720 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2c730 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
2c740 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
2c750 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
2c760 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
2c770 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
2c780 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
2c790 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
2c7a0 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
2c7b0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
2c7c0 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
2c7d0 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
2c7e0 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
2c7f0 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pWC);.  if( db->
2c800 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2c810 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2c820 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
2c830 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2c840 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
2c850 69 65 72 2c 20 69 66 20 74 68 65 72 65 20 69 73  ier, if there is
2c860 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64 61   one, is redunda
2c870 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74 20  nt. .  ** If it 
2c880 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44 69  is, then set pDi
2c890 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20 61  stinct to NULL a
2c8a0 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44 69  nd WhereInfo.eDi
2c8b0 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20 57  stinct to.  ** W
2c8c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2c8d0 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68 65  IQUE to tell the
2c8e0 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f 72   caller to ignor
2c8f0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e 0a  e the DISTINCT..
2c900 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73 74    */.  if( pDist
2c910 69 6e 63 74 20 26 26 20 69 73 44 69 73 74 69 6e  inct && isDistin
2c920 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
2c930 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2c940 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20 29 7b  C, pDistinct) ){
2c950 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74 20 3d  .    pDistinct =
2c960 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   0;.    pWInfo->
2c970 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
2c980 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
2c990 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  E;.  }..  /* Cho
2c9a0 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
2c9b0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
2c9c0 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
2c9d0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
2c9e0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2c9f0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
2ca00 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
2ca10 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
2ca20 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
2ca30 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
2ca40 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
2ca50 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
2ca60 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2ca70 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45 52 45  .wsFlags   WHERE
2ca80 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
2ca90 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
2caa0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2cab0 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
2cac0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
2cad0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
2cae0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2caf0 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
2cb00 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ich term of the 
2cb10 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
2cb20 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
2cb30 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
2cb40 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
2cb50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
2cb60 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
2cb70 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2cb80 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
2cb90 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
2cba0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20  the index.  **  
2cbb0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65   pWInfo->a[].pTe
2cbc0 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c  rm     When wsFl
2cbd0 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20  ags==WO_OR, the 
2cbe0 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20  OR-clause term. 
2cbf0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
2cc00 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
2cc10 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
2cc20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
2cc30 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
2cc40 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
2cc50 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
2cc60 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64 46 6c 61  mask)0;.  andFla
2cc70 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45  gs = ~0;.  WHERE
2cc80 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
2cc90 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
2cca0 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46  n"));.  for(i=iF
2ccb0 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
2ccc0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c  Info->a; i<nTabL
2ccd0 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  ist; i++, pLevel
2cce0 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f  ++){.    WhereCo
2ccf0 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20  st bestPlan;    
2cd00 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66       /* Most eff
2cd10 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e  icient plan seen
2cd20 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49   so far */.    I
2cd30 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2cd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2cd50 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62  dex for FROM tab
2cd60 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a  le at pTabItem *
2cd70 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd90 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2cda0 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
2cdb0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  s */.    int bes
2cdc0 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  tJ = -1;        
2cdd0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
2cde0 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69  e of j */.    Bi
2cdf0 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20  tmask m;        
2ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
2ce10 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a  mask value for j
2ce20 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20   or bestJ */.   
2ce30 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20   int isOptimal; 
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce50 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70 74  Iterator for opt
2ce60 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c  imal/non-optimal
2ce70 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69   search */.    i
2ce80 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65  nt nUnconstraine
2ce90 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  d;         /* Nu
2cea0 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69 74 68  mber tables with
2ceb0 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59 20 2a  out INDEXED BY *
2cec0 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f  /.    Bitmask no
2ced0 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20  tIndexed;       
2cee0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
2cef0 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  les that cannot 
2cf00 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a  use an index */.
2cf10 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65 73  .    memset(&bes
2cf20 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  tPlan, 0, sizeof
2cf30 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20  (bestPlan));.   
2cf40 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20   bestPlan.rCost 
2cf50 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
2cf60 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
2cf70 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73 65 61  (("*** Begin sea
2cf80 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20  rch for loop %d 
2cf90 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a 0a 20 20  ***\n", i));..  
2cfa0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
2cfb0 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  h the remaining 
2cfc0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46  entries in the F
2cfd0 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69  ROM clause to fi
2cfe0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  nd the.    ** ne
2cff0 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20  xt nested loop. 
2d000 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61  The loop tests a
2d010 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ll FROM clause e
2d020 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69  ntries.    ** ei
2d030 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69  ther once or twi
2d040 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ce. .    **.    
2d050 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 65 73  ** The first tes
2d060 74 20 69 73 20 61 6c 77 61 79 73 20 70 65 72 66  t is always perf
2d070 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 61  ormed if there a
2d080 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65  re two or more e
2d090 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65  ntries.    ** re
2d0a0 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65  maining and neve
2d0b0 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  r performed if t
2d0c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
2d0d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
2d0e0 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f  ry.    ** to cho
2d0f0 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66  ose from.  The f
2d100 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20  irst test looks 
2d110 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22  for an "optimal"
2d120 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a   scan.  In.    *
2d130 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61  * this context a
2d140 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69  n optimal scan i
2d150 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20  s one that uses 
2d160 74 68 65 20 73 61 6d 65 20 73 74 72 61 74 65 67  the same strateg
2d170 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  y.    ** for the
2d180 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75   given FROM clau
2d190 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c  se entry as woul
2d1a0 64 20 62 65 20 73 65 6c 65 63 74 65 64 20 69 66  d be selected if
2d1b0 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a   the entry.    *
2d1c0 2a 20 77 65 72 65 20 75 73 65 64 20 61 73 20 74  * were used as t
2d1d0 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73  he innermost nes
2d1e0 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74  ted loop.  In ot
2d1f0 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62  her words, a tab
2d200 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f  le.    ** is cho
2d210 73 65 6e 20 73 75 63 68 20 74 68 61 74 20 74 68  sen such that th
2d220 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e  e cost of runnin
2d230 67 20 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e  g that table can
2d240 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a 20  not be reduced. 
2d250 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67     ** by waiting
2d260 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65   for other table
2d270 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20  s to run first. 
2d280 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20   This "optimal" 
2d290 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a  test works.    *
2d2a0 2a 20 62 79 20 66 69 72 73 74 20 61 73 73 75 6d  * by first assum
2d2b0 69 6e 67 20 74 68 61 74 20 74 68 65 20 46 52 4f  ing that the FRO
2d2c0 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74  M clause is on t
2d2d0 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e  he inner loop an
2d2e0 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  d finding.    **
2d2f0 20 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c   its query plan,
2d300 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74   then checking t
2d310 6f 20 73 65 65 20 69 66 20 74 68 61 74 20 71 75  o see if that qu
2d320 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e  ery plan uses an
2d330 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46  y.    ** other F
2d340 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
2d350 20 74 68 61 74 20 61 72 65 20 6e 6f 74 52 65 61   that are notRea
2d360 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 52 65  dy.  If no notRe
2d370 61 64 79 20 74 65 72 6d 73 20 61 72 65 0a 20 20  ady terms are.  
2d380 20 20 2a 2a 20 75 73 65 64 20 74 68 65 6e 20 74    ** used then t
2d390 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71 75 65  he "optimal" que
2d3a0 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20  ry plan works.. 
2d3b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
2d3c0 65 20 74 68 61 74 20 74 68 65 20 57 68 65 72 65  e that the Where
2d3d0 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65  Cost.nRow parame
2d3e0 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d  ter for an optim
2d3f0 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a 20 20  al scan might.  
2d400 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20 73    ** not be as s
2d410 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c 64  mall as it would
2d420 20 62 65 20 69 66 20 74 68 65 20 74 61 62 6c 65   be if the table
2d430 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74 68 65   really were the
2d440 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a   innermost.    *
2d450 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f  * join.  The nRo
2d460 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72  w value can be r
2d470 65 64 75 63 65 64 20 62 79 20 57 48 45 52 45 20  educed by WHERE 
2d480 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
2d490 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ts.    ** that d
2d4a0 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69 63 65  o not use indice
2d4b0 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e 52 6f  s.  But this nRo
2d4c0 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79  w reduction only
2d4d0 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 0a   happens if the.
2d4e0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72 65 61      ** table rea
2d4f0 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e 65 72  lly is the inner
2d500 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20  most join.  .   
2d510 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2d520 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61  econd loop itera
2d530 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72  tion is only per
2d540 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74  formed if no opt
2d550 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a  imal scan.    **
2d560 20 73 74 72 61 74 65 67 69 65 73 20 77 65 72 65   strategies were
2d570 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69   found by the fi
2d580 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  rst iteration. T
2d590 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65 72 61  his second itera
2d5a0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75  tion.    ** is u
2d5b0 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f  sed to search fo
2d5c0 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  r the lowest cos
2d5d0 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a  t scan overall..
2d5e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72      **.    ** Pr
2d5f0 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
2d600 6f 66 20 53 51 4c 69 74 65 20 70 65 72 66 6f 72  of SQLite perfor
2d610 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20 73 65 63  med only the sec
2d620 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a  ond iteration -.
2d630 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20      ** the next 
2d640 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77  outermost loop w
2d650 61 73 20 61 6c 77 61 79 73 20 74 68 61 74 20 77  as always that w
2d660 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 6f  ith the lowest o
2d670 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  verall.    ** co
2d680 73 74 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69  st. However, thi
2d690 73 20 6d 65 61 6e 74 20 74 68 61 74 20 53 51 4c  s meant that SQL
2d6a0 69 74 65 20 63 6f 75 6c 64 20 73 65 6c 65 63 74  ite could select
2d6b0 20 74 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a   the wrong plan.
2d6c0 20 20 20 20 2a 2a 20 66 6f 72 20 73 63 72 69 70      ** for scrip
2d6d0 74 73 20 73 75 63 68 20 61 73 20 74 68 65 20 66  ts such as the f
2d6e0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a  ollowing:.    **
2d6f0 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45     .    **   CRE
2d700 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2d710 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52  b); .    **   CR
2d720 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c  EATE TABLE t2(c,
2d730 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45   d);.    **   SE
2d740 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20  LECT * FROM t2, 
2d750 74 31 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69  t1 WHERE t2.rowi
2d760 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a  d = t1.a;.    **
2d770 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74  .    ** The best
2d780 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
2d790 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2d7a0 74 61 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20  table t1 first. 
2d7b0 48 6f 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a  However it.    *
2d7c0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
2d7d0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
2d7e0 68 69 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c  his with a simpl
2d7f0 65 20 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74  e greedy algorit
2d800 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65  hm..    ** Since
2d810 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c   the cost of a l
2d820 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2d830 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74  gh table t2 is t
2d840 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20  he same .    ** 
2d850 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  as the cost of a
2d860 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
2d870 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61  ough table t1, a
2d880 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a   simple greedy .
2d890 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d      ** algorithm
2d8a0 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75   may choose to u
2d8b0 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75  se t2 for the ou
2d8c0 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20  ter loop, which 
2d8d0 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a  is a much.    **
2d8e0 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61   costlier approa
2d8f0 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ch..    */.    n
2d900 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20  Unconstrained = 
2d910 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65  0;.    notIndexe
2d920 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  d = 0;.    for(i
2d930 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c  sOptimal=(iFrom<
2d940 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f  nTabList-1); isO
2d950 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73  ptimal>=0 && bes
2d960 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d  tJ<0; isOptimal-
2d970 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  -){.      Bitmas
2d980 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  k mask;         
2d990 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
2d9a0 61 62 6c 65 73 20 6e 6f 74 20 79 65 74 20 72 65  ables not yet re
2d9b0 61 64 79 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ady */.      for
2d9c0 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
2d9d0 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
2d9e0 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20  j]; j<nTabList; 
2d9f0 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
2da00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f  {.        int do
2da10 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f  NotReorder;    /
2da20 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74  * True if this t
2da30 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  able should not 
2da40 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  be reordered */.
2da50 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73          WhereCos
2da60 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20  t sCost;     /* 
2da70 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Cost information
2da80 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75   from best[Virtu
2da90 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20  al]Index() */.  
2daa0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2dab0 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52  pOrderBy;  /* OR
2dac0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
2dad0 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d  r index to optim
2dae0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  ize */.        E
2daf0 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 3b 20  xprList *pDist; 
2db00 20 20 20 20 2f 2a 20 44 49 53 54 49 4e 43 54 20      /* DISTINCT 
2db10 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78  clause for index
2db20 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a   to optimize */.
2db30 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74    .        doNot
2db40 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62  Reorder =  (pTab
2db50 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
2db60 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
2db70 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  SS))!=0;.       
2db80 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26   if( j!=iFrom &&
2db90 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
2dba0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d  break;.        m
2dbb0 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
2dbc0 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
2dbd0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
2dbe0 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61   if( (m & notRea
2dbf0 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
2dc00 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
2dc10 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
2dc20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2dc30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc40 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74 69    mask = (isOpti
2dc50 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65 61  mal ? m : notRea
2dc60 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  dy);.        pOr
2dc70 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20 26  derBy = ((i==0 &
2dc80 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a 70  & ppOrderBy )?*p
2dc90 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20 20 20  pOrderBy:0);.   
2dca0 20 20 20 20 20 70 44 69 73 74 20 3d 20 28 69 3d       pDist = (i=
2dcb0 3d 30 20 3f 20 70 44 69 73 74 69 6e 63 74 20 3a  =0 ? pDistinct :
2dcc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2dcd0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2dce0 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73 74 72  x==0 ) nUnconstr
2dcf0 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20 20 20  ained++;.  .    
2dd00 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
2dd10 22 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61 62 6c  "=== trying tabl
2dd20 65 20 25 64 20 77 69 74 68 20 69 73 4f 70 74 69  e %d with isOpti
2dd30 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a 20  mal=%d ===\n",. 
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 20 20 6a 2c 20 69 73 4f 70 74 69 6d 61 6c 29     j, isOptimal)
2dd60 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2dd70 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  t( pTabItem->pTa
2dd80 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
2dd90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2dda0 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
2ddb0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2ddc0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
2ddd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dde0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
2ddf0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
2de00 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
2de10 20 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c       bestVirtual
2de20 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
2de30 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d 61 73  C, pTabItem, mas
2de40 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72  k, notReady, pOr
2de50 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de70 20 20 26 73 43 6f 73 74 2c 20 70 70 29 3b 0a 20    &sCost, pp);. 
2de80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65         }else .#e
2de90 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
2dea0 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74 72           bestBtr
2deb0 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  eeIndex(pParse, 
2dec0 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d  pWC, pTabItem, m
2ded0 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  ask, notReady, p
2dee0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2def0 20 20 20 20 20 20 20 70 44 69 73 74 2c 20 26 73         pDist, &s
2df00 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
2df10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2df20 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28 73   isOptimal || (s
2df30 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61  Cost.used&notRea
2df40 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  dy)==0 );..     
2df50 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45     /* If an INDE
2df60 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73  XED BY clause is
2df70 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
2df80 68 65 20 70 6c 61 6e 20 6d 75 73 74 20 75 73 65  he plan must use
2df90 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2dfa0 20 69 6e 64 65 78 20 69 66 20 69 74 20 75 73 65   index if it use
2dfb0 73 20 61 6e 79 20 69 6e 64 65 78 20 61 74 20 61  s any index at a
2dfc0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ll */.        as
2dfd0 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
2dfe0 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
2dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2e000 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2e010 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2e020 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20  FULLSCAN)==0.   
2e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2e040 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  | sCost.plan.u.p
2e050 49 64 78 3d 3d 70 54 61 62 49 74 65 6d 2d 3e 70  Idx==pTabItem->p
2e060 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20  Index );..      
2e070 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20    if( isOptimal 
2e080 26 26 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77  && (sCost.plan.w
2e090 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2e0a0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
2e0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 74  ){.          not
2e0c0 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20 20  Indexed |= m;.  
2e0d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2e0e0 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75   /* Conditions u
2e0f0 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73 20  nder which this 
2e100 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68  table becomes th
2e110 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a 20  e best so far:. 
2e120 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e130 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 74    **   (1) The t
2e140 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64 65  able must not de
2e150 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74 61  pend on other ta
2e160 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  bles that have n
2e170 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ot.        **   
2e180 20 20 20 20 79 65 74 20 72 75 6e 2e 0a 20 20 20      yet run..   
2e190 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e1a0 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c 6c 2d  **   (2) A full-
2e1b0 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61 6e 20  table-scan plan 
2e1c0 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65 64 65  cannot supercede
2e1d0 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20 75 6e   indexed plan un
2e1e0 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  less.        ** 
2e1f0 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c 2d 74        the full-t
2e200 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61 6e 20  able-scan is an 
2e210 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e 20 61  "optimal" plan a
2e220 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e  s defined above.
2e230 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e240 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c      **   (3) All
2e250 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e 20   tables have an 
2e260 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2e270 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20  e or this table 
2e280 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20 20  lacks an.       
2e290 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58 45   **       INDEXE
2e2a0 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74  D BY clause or t
2e2b0 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20 74  his table uses t
2e2c0 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20 20  he specific.    
2e2d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 64      **       ind
2e2e0 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ex specified by 
2e2f0 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20 63  its INDEXED BY c
2e300 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75 6c  lause.  This rul
2e310 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20 20  e ensures.      
2e320 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20    **       that 
2e330 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69 73  a best-so-far is
2e340 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65 64   always selected
2e350 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f   even if an impo
2e360 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2e370 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61 74  *       combinat
2e380 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20 42  ion of INDEXED B
2e390 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67 69  Y clauses are gi
2e3a0 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 0a  ven.  The error.
2e3b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2e3c0 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
2e3d0 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62 61  d and relayed ba
2e3e0 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63  ck to the applic
2e3f0 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20  ation later..   
2e400 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54 68       **       Th
2e410 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73 20  e NEVER() comes 
2e420 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72 75  about because ru
2e430 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72 65  le (2) above pre
2e440 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
2e450 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78 61         An indexa
2e460 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  ble full-table-s
2e470 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69 6e  can from reachin
2e480 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20 20  g rule (3)..    
2e490 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e4a0 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61 6e  *   (4) The plan
2e4b0 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c 6f   cost must be lo
2e4c0 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20 70  wer than prior p
2e4d0 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20 74 68 65  lans or else the
2e4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2e4f0 20 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 74    cost must be t
2e500 68 65 20 73 61 6d 65 20 61 6e 64 20 74 68 65 20  he same and the 
2e510 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
2e520 75 73 74 20 62 65 20 6c 6f 77 65 72 2e 0a 20 20  ust be lower..  
2e530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e540 20 69 66 28 20 28 73 43 6f 73 74 2e 75 73 65 64   if( (sCost.used
2e550 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 20 20  &notReady)==0   
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e570 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
2e580 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65            && (be
2e590 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e 64  stJ<0 || (notInd
2e5a0 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20 20  exed&m)!=0      
2e5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
2e5c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2e5d0 20 20 20 7c 7c 20 28 62 65 73 74 50 6c 61 6e 2e     || (bestPlan.
2e5e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e5f0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2e600 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
2e610 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e        || (sCost.
2e620 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e630 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2e640 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  N)!=0).         
2e650 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74 72     && (nUnconstr
2e660 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62  ained==0 || pTab
2e670 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  Item->pIndex==0 
2e680 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
2e690 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 4e              || N
2e6a0 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c 61 6e  EVER((sCost.plan
2e6b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2e6c0 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d  _NOT_FULLSCAN)!=
2e6d0 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
2e6e0 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 73  && (bestJ<0 || s
2e6f0 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50  Cost.rCost<bestP
2e700 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20 20 2f  lan.rCost      /
2e710 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
2e720 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f           || (sCo
2e730 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50 6c  st.rCost<=bestPl
2e740 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20 20  an.rCost .      
2e750 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 43             && sC
2e760 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 62 65  ost.plan.nRow<be
2e770 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77  stPlan.plan.nRow
2e780 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
2e790 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
2e7a0 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65 20 25  CE(("=== table %
2e7b0 64 20 69 73 20 62 65 73 74 20 73 6f 20 66 61 72  d is best so far
2e7c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2e7d0 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 63          " with c
2e7e0 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77 3d  ost=%g and nRow=
2e7f0 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
2e800 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
2e810 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43 6f  sCost.rCost, sCo
2e820 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a  st.plan.nRow));.
2e830 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c            bestPl
2e840 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20 20  an = sCost;.    
2e850 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b        bestJ = j;
2e860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e870 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72     if( doNotReor
2e880 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
2e890 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2e8a0 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30 20  ssert( bestJ>=0 
2e8b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2e8c0 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d 61 73  otReady & getMas
2e8d0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2e8e0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
2e8f0 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 57  Cursor) );.    W
2e900 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2e910 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74  Optimizer select
2e920 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  s table %d for l
2e930 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20 20 20  oop %d".        
2e940 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 63          " with c
2e950 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77 3d  ost=%g and nRow=
2e960 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
2e970 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 4c         bestJ, pL
2e980 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20  evel-pWInfo->a, 
2e990 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20  bestPlan.rCost, 
2e9a0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2e9b0 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  ow));.    if( (b
2e9c0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2e9d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
2e9e0 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
2e9f0 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
2ea00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ea10 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
2ea20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  sFlags & WHERE_D
2ea30 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a 20  ISTINCT)!=0 ){. 
2ea40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
2ea50 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
2ea60 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
2ea70 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2ea80 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2ea90 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DERED;.    }.   
2eaa0 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
2eab0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2eac0 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
2ead0 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e  plan = bestPlan.
2eae0 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63 61  plan;.    testca
2eaf0 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  se( bestPlan.pla
2eb00 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2eb10 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20  E_INDEXED );.   
2eb20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50   testcase( bestP
2eb30 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2eb40 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2eb50 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20 62  DEX );.    if( b
2eb60 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2eb70 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
2eb80 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d 50  DEXED|WHERE_TEMP
2eb90 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 20  _INDEX) ){.     
2eba0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2ebb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2ebc0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
2ebd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
2ebe0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
2ebf0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
2ec00 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  ~getMask(pMaskSe
2ec10 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
2ec20 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
2ec30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
2ec40 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 20  m = (u8)bestJ;. 
2ec50 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
2ec60 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62  plan.nRow>=(doub
2ec70 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70 50  le)1 ){.      pP
2ec80 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2ec90 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61   *= bestPlan.pla
2eca0 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a 20  n.nRow;.    }.. 
2ecb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2ecc0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 63   if the table sc
2ecd0 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f  anned by this lo
2ece0 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64  op iteration had
2ecf0 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58   an.    ** INDEX
2ed00 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74  ED BY clause att
2ed10 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61  ached to it, tha
2ed20 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  t the named inde
2ed30 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a  x is being.    *
2ed40 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73  * used for the s
2ed50 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65  can. If not, the
2ed60 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74  n query compilat
2ed70 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a  ion has failed..
2ed80 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e      ** Return an
2ed90 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
2eda0 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69     pIdx = pTabLi
2edb0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e  st->a[bestJ].pIn
2edc0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 64  dex;.    if( pId
2edd0 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  x ){.      if( (
2ede0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2edf0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2ee00 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20  DEXED)==0 ){.   
2ee10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2ee20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
2ee30 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20  nnot use index: 
2ee40 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
2ee50 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2ee60 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2ee70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ee80 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49        /* If an I
2ee90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2eea0 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62 65   is used, the be
2eeb0 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74 69  stIndex() functi
2eec0 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  on is.        **
2eed0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
2eee0 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73 70  ind the index sp
2eef0 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 49  ecified in the I
2ef00 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2ef10 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69  .        ** if i
2ef20 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78 20  t find an index 
2ef30 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  at all. */.     
2ef40 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74 50     assert( bestP
2ef50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  lan.plan.u.pIdx=
2ef60 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20 7d  =pIdx );.      }
2ef70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45  .    }.  }.  WHE
2ef80 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
2ef90 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
2efa0 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28   ***\n"));.  if(
2efb0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2efc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2efd0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  d ){.    goto wh
2efe0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2eff0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2f000 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79  total query only
2f010 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c   selects a singl
2f020 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20  e row, then the 
2f030 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
2f040 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61  ause is irreleva
2f050 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  nt..  */.  if( (
2f060 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
2f070 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70  _UNIQUE)!=0 && p
2f080 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2f090 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
2f0a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2f0b0 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
2f0c0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
2f0d0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
2f0e0 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
2f0f0 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
2f100 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
2f110 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
2f120 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
2f130 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
2f140 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
2f150 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
2f160 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
2f170 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
2f180 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
2f190 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
2f1a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2f1b0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2f1c0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2f1d0 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e  IRED)==0 || pWIn
2f1e0 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b  fo->nLevel==1 );
2f1f0 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61  .  if( (wctrlFla
2f200 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2f210 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26  SS_DESIRED)!=0 &
2f220 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  & (andFlags & WH
2f230 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29  ERE_UNIQUE)!=0 )
2f240 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b  {.    pWInfo->ok
2f250 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20  OnePass = 1;.   
2f260 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c   pWInfo->a[0].pl
2f270 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57  an.wsFlags &= ~W
2f280 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
2f290 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
2f2a0 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2f2b0 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
2f2c0 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
2f2d0 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
2f2e0 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
2f2f0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
2f300 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2f310 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
2f320 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
2f330 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
2f340 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20  o */.  notReady 
2f350 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2f360 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2f370 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20   = (double)1;.  
2f380 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
2f390 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61  pWInfo->a; i<nTa
2f3a0 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76  bList; i++, pLev
2f3b0 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
2f3c0 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
2f3d0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
2f3e0 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20      int iDb;    
2f3f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2f400 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2f410 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78  ning table/index
2f420 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65   */..    pTabIte
2f430 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2f440 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2f450 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
2f460 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2f470 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2f480 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2f490 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  sor;.    pWInfo-
2f4a0 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65 76  >nRowOut *= pLev
2f4b0 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20  el->plan.nRow;. 
2f4c0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
2f4d0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
2f4e0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2f4f0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
2f500 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
2f510 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
2f520 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
2f530 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
2f540 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
2f550 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
2f560 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2f570 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  LE.    if( (pLev
2f580 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f590 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2f5a0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
2f5b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
2f5c0 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
2f5d0 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
2f5e0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
2f5f0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20  .      int iCur 
2f600 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
2f610 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sor;.      sqlit
2f620 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2f630 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20  OP_VOpen, iCur, 
2f640 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34 5f  0, 0, pVTab, P4_
2f650 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
2f660 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2f670 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2f680 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2f690 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20  X_ONLY)==0.     
2f6a0 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
2f6b0 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
2f6c0 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  OPEN)==0 ){.    
2f6d0 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66    int op = pWInf
2f6e0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f  o->okOnePass ? O
2f6f0 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50  P_OpenWrite : OP
2f700 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
2f710 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
2f720 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
2f730 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
2f740 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
2f750 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
2f760 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
2f770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2f780 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
2f790 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
2f7a0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2f7b0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
2f7c0 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42  BMS ){.        B
2f7d0 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2f7e0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2f7f0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2f800 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2f810 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2f820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f830 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2f840 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f850 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20  ntAddr(v)-1, .  
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f870 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2f880 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2f890 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2f8a0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2f8b0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2f8c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2f8d0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
2f8e0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
2f8f0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
2f900 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2f910 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2f920 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
2f930 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
2f940 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2f950 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f960 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29  TEMP_INDEX)!=0 )
2f970 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2f980 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2f990 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61  pParse, pWC, pTa
2f9a0 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
2f9b0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65   pLevel);.    }e
2f9c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
2f9d0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2f9e0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2f9f0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
2fa00 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
2fa10 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
2fa20 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65  u.pIdx;.      Ke
2fa30 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
2fa40 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
2fa50 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
2fa60 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 75        int iIdxCu
2fa70 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
2fa80 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
2fa90 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
2faa0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
2fab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2fac0 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
2fad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fae0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2faf0 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
2fb00 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  Ix->tnum, iDb,. 
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2fb30 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
2fb40 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56  ANDOFF);.      V
2fb50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fb60 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
2fb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2fb80 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
2fb90 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
2fba0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2fbb0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d  &= ~getMask(pWC-
2fbc0 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >pMaskSet, pTabI
2fbd0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2fbe0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
2fbf0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2fc00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2fc10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fc20 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2fc30 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2fc40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2fc50 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
2fc60 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
2fc70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
2fc80 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
2fc90 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
2fca0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
2fcb0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
2fcc0 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
2fcd0 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
2fce0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2fcf0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2fd00 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20  TabList; i++){. 
2fd10 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2fd20 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 65  nfo->a[i];.    e
2fd30 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50  xplainOneScan(pP
2fd40 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2fd50 70 4c 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76 65  pLevel, i, pLeve
2fd60 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
2fd70 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65  lags);.    notRe
2fd80 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
2fd90 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
2fda0 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f  , wctrlFlags, no
2fdb0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
2fdc0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2fdd0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2fde0 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
2fdf0 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
2fe00 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2fe10 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2fe20 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
2fe30 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
2fe40 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
2fe50 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
2fe60 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
2fe70 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
2fe80 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
2fe90 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
2fea0 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
2feb0 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
2fec0 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
2fed0 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
2fee0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
2fef0 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
2ff00 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
2ff10 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
2ff20 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
2ff30 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
2ff40 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
2ff50 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  0; i<nTabList; i
2ff60 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
2ff70 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
2ff80 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2ff90 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
2ffa0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2ffb0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2ffc0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
2ffd0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
2ffe0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
2fff0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
30000 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
30010 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
30020 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
30030 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
30040 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30050 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
30060 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
30070 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30080 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
30090 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
300a0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
300b0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29  QPlan], "{}", 2)
300c0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
300d0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
300e0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
300f0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
30100 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
30110 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  z, n);.        n
30120 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
30130 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30140 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
30150 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
30160 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
30170 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
30180 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
30190 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74  OWID_EQ );.    t
301a0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
301b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
301c0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
301d0 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
301e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
301f0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
30200 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
30210 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
30220 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
30230 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30240 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20  n], "* ", 2);.  
30250 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
30260 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
30270 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
30280 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
30290 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
302a0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
302b0 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
302c0 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
302d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
302e0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
302f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30300 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
30310 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
30320 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30330 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
30340 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
30350 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
30360 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
30370 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
30380 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
30390 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
303a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
303b0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
303c0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
303d0 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
303e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
303f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
30400 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
30410 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30420 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
30430 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30440 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
30450 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
30460 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
30470 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
30480 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
30490 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
304a0 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
304b0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
304c0 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
304d0 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
304e0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
304f0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
30500 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
30510 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
30520 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
30530 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
30540 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
30550 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
30560 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
30570 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
30580 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
30590 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
305a0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
305b0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
305c0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
305d0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
305e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
305f0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
30600 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
30610 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
30620 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
30630 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
30640 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
30650 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
30660 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
30670 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
30680 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
30690 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
306a0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
306b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
306c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
306d0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
306e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
306f0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
30700 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
30710 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
30720 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
30730 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
30740 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
30750 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
30760 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
30770 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
30780 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
30790 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
307a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
307b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
307c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
307d0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
307e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
307f0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
30800 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30810 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
30820 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
30830 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
30840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30850 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
30860 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
30870 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
30880 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
30890 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
308a0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
308b0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
308c0 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
308d0 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
308e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
308f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30900 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
30910 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
30920 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
30930 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
30940 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
30950 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
30960 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30970 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
30980 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
30990 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
309a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
309b0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
309c0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
309d0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
309e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
309f0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
30a00 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
30a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
30a20 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
30a30 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
30a40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30a50 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30a60 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
30a70 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
30a80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
30a90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
30aa0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
30ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30ac0 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
30ad0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
30ae0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
30af0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30b00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30b10 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
30b20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
30b30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30b40 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30b50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
30b60 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30b70 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30b80 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
30b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30ba0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30bb0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
30bc0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
30bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30be0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
30bf0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
30c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30c10 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
30c20 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
30c30 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
30c40 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
30c50 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
30c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30c80 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
30c90 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
30ca0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
30cb0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
30cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30cd0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
30ce0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
30cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
30d00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
30d10 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
30d20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
30d30 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
30d40 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
30d50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30d60 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
30d70 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
30d80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30d90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
30da0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
30db0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
30dc0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
30dd0 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
30de0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30df0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
30e00 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
30e10 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
30e20 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
30e30 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
30e40 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
30e50 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
30e60 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
30e70 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
30e80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
30e90 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
30ea0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
30eb0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
30ec0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
30ed0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
30ee0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
30ef0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
30f00 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
30f10 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
30f20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
30f30 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
30f40 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30f50 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43  s & WHERE_OMIT_C
30f60 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  LOSE)==0.    ){.
30f70 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
30f80 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
30f90 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ags;.      if( !
30fa0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
30fb0 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  s && (ws & WHERE
30fc0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
30fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30fe0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30ff0 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
31000 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
31010 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
31020 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
31030 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20 57  D)!=0 && (ws & W
31040 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
31050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
31060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
31070 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
31080 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
31090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
310a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
310b0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
310c0 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
310d0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
310e0 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
310f0 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
31100 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
31110 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
31120 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
31130 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
31140 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
31150 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
31160 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
31170 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
31180 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
31190 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
311a0 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
311b0 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
311c0 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
311d0 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
311e0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
311f0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
31200 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
31210 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
31220 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
31230 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
31240 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
31250 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
31260 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
31270 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
31280 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
31290 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
312a0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
312b0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
312c0 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
312d0 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
312e0 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
312f0 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
31300 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
31310 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
31320 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
31330 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
31340 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
31350 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
31360 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4c    */.    if( (pL
31370 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
31380 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
31390 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d 3e 6d  ED)!=0 && !db->m
313a0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20  allocFailed){.  
313b0 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
313c0 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
313d0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
313e0 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
313f0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
31400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31410 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
31420 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
31430 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
31440 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
31450 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
31460 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
31470 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
31480 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
31490 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
314a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
314b0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
314c0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
314d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
314e0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
314f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
31500 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
31510 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
31520 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31530 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
31540 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
31560 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
31570 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
31580 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
31590 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
315a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
315b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
315c0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
315d0 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
315e0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
315f0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
31610 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
31620 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
31630 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
31640 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
31650 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
31660 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
31670 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
31680 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
31690 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
316a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
316b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
316c0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
316d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
316e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
316f0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
31700 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
31710 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
31720 75 72 6e 3b 0a 7d 0a                             urn;.}.