/ Hex Artifact Content
Login

Artifact a6e89fe7e56ab7e633be6fdebdddd857e9e5bc99:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a  ral index */../*
2c40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2c50: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
2c60: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2c70: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2c80: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
2c90: 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75  nit(.  WhereClau
2ca0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
2cb0: 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  /* The WhereClau
2cc0: 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c  se to be initial
2cd0: 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20  ized */.  Parse 
2ce0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2cf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
2d00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
2d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2d20: 73 6b 53 65 74 20 20 20 2f 2a 20 4d 61 70 70 69  skSet   /* Mappi
2d30: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75  ng from table cu
2d40: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
2d50: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20  bitmasks */.){. 
2d60: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2d70: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2d80: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2d90: 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  t;.  pWC->nTerm 
2da0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
2db0: 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57  t = ArraySize(pW
2dc0: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
2dd0: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
2de0: 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61  atic;.  pWC->vma
2df0: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  sk = 0;.}../* Fo
2e00: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
2e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2e20: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2e30: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
2e40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2e50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2e60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2e70: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
2e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e90: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
2ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2eb0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
2ec0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
2ed0: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
2ee0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ef0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
2f00: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2f10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2f20: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
2f30: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
2f40: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
2f50: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
2f60: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
2f70: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
2f80: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
2f90: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
2fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2fc0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
2fd0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
2fe0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
2ff0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
3000: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
3010: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3020: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
3030: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
3040: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
3050: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
3060: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
3070: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
3080: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
3090: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
30a0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
30b0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
30c0: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
30d0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
30e0: 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c  .    if( a->wtFl
30f0: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
3100: 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IC ){.      sqli
3110: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3120: 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  , a->pExpr);.   
3130: 20 7d 0a 20 20 20 20 69 66 28 20 61 2d 3e 77 74   }.    if( a->wt
3140: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
3150: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
3160: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 64  reOrInfoDelete(d
3170: 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29  b, a->u.pOrInfo)
3180: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3190: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
31a0: 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20  M_ANDINFO ){.   
31b0: 20 20 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44     whereAndInfoD
31c0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
31d0: 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  AndInfo);.    }.
31e0: 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61    }.  if( pWC->a
31f0: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
3200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3210: 72 65 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b  ree(db, pWC->a);
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3230: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57  d a single new W
3240: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74  hereTerm entry t
3250: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
3260: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
3270: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   The new WhereTe
3280: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  rm object is con
3290: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78  structed from Ex
32a0: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74  pr p and with wt
32b0: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e  Flags..** The in
32c0: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20  dex in pWC->a[] 
32d0: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65  of the new Where
32e0: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64  Term is returned
32f0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20   on success..** 
3300: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
3310: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65   the new WhereTe
3320: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  rm could not be 
3330: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d  added due to a m
3340: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
3350: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20  ion error.  The 
3360: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3370: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62  n failure will b
3380: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a  e recorded in.**
3390: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
33a0: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68  ailed flag so th
33b0: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  at higher-level 
33c0: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65  functions can de
33d0: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  tect it..**.** T
33e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
33f0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   increase the si
3400: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61  ze of the pWC->a
3410: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
3420: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
3430: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75  the wtFlags argu
3440: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45  ment includes TE
3450: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  RM_DYNAMIC, then
3460: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3470: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  ** for freeing t
3480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
3490: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68  is assumed by th
34a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
34b0: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69  ject pWC..** Thi
34c0: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69  s is true even i
34d0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
34e0: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ails to allocate
34f0: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d   a new WhereTerm
3500: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
3510: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
3520: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20  ight reallocate 
3530: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74  the space used t
3540: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65  o store.** Where
3550: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e  Terms.  All poin
3560: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72  ters to WhereTer
3570: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ms should be inv
3580: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a  alidated after.*
3590: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
35a0: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
35b0: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
35c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
35d0: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
35e0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
35f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3600: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
3610: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3620: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 38 20  WC, Expr *p, u8 
3630: 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 72  wtFlags){.  Wher
3640: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
3650: 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 63  int idx;.  testc
3660: 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 54  ase( wtFlags & T
3670: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
3680: 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31  /* EV: R-00211-1
3690: 35 31 30 30 20 2a 2f 0a 20 20 69 66 28 20 70 57  5100 */.  if( pW
36a0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
36b0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
36c0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
36d0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
36e0: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61  3 *db = pWC->pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43  rse->db;.    pWC
3700: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
3710: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3720: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
3730: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
3740: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
3750: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 74   ){.      if( wt
3760: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  Flags & TERM_DYN
3770: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  AMIC ){.        
3780: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3790: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
37a0: 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d  }.      pWC->a =
37b0: 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74   pOld;.      ret
37c0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
37d0: 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20   memcpy(pWC->a, 
37e0: 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43  pOld, sizeof(pWC
37f0: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65  ->a[0])*pWC->nTe
3800: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  rm);.    if( pOl
3810: 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  d!=pWC->aStatic 
3820: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3830: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c 64 29  DbFree(db, pOld)
3840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d  ;.    }.    pWC-
3850: 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33  >nSlot = sqlite3
3860: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
3870: 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28   pWC->a)/sizeof(
3880: 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a  pWC->a[0]);.  }.
3890: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
38a0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
38b0: 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e  rm++];.  pTerm->
38c0: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
38d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74  rm->wtFlags = wt
38e0: 46 6c 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e  Flags;.  pTerm->
38f0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65  pWC = pWC;.  pTe
3900: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
3910: 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a  ;.  return idx;.
3920: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3930: 75 74 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73  utine identifies
3940: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
3950: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3960: 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63  use where.** eac
3970: 68 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  h subexpression 
3980: 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
3990: 74 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  the AND operator
39a0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   or some other.*
39b0: 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69  * operator speci
39c0: 66 69 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70  fied in the op p
39d0: 61 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57  arameter.  The W
39e0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
39f0: 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65  ture.** is fille
3a00: 64 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  d with pointers 
3a10: 74 6f 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  to subexpression
3a20: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
3a30: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
3a40: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
3a50: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
3a60: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
3a70: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
3a80: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
3a90: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
3aa0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3ab0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
3ad0: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
3ae0: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
3af0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
3b00: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
3b10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
3b20: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
3b30: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
3b40: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
3b50: 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74   make slot[] ent
3b60: 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75  ries point to su
3b70: 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68 69  bstructure withi
3b80: 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49  n pExpr..**.** I
3b90: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
3ba0: 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74  entence and in t
3bb0: 68 65 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f  he diagram, "slo
3bc0: 74 5b 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a  t[]" refers to.*
3bd0: 2a 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  * the WhereClaus
3be0: 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68  e.a[] array.  Th
3bf0: 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67  e slot[] array g
3c00: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
3c10: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
3c20: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
3c30: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
3c40: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
3c50: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
3c60: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
3c70: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
3c80: 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  pWC->op = (u8)op
3c90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
3ca0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3cb0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
3cc0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
3cd0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
3ce0: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
3cf0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3d00: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
3d10: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
3d20: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3d30: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
3d40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
3d50: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
3d60: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28  ssion mask set (
3d70: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
3d80: 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e  bject).*/.#defin
3d90: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
3da0: 20 20 6d 65 6d 73 65 74 28 50 2c 20 30 2c 20 73    memset(P, 0, s
3db0: 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a  izeof(*P))../*.*
3dc0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
3dd0: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
3de0: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
3df0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
3e00: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
3e10: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
3e20: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
3e30: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
3e40: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3e50: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
3e60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3e70: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 73 69 7a  pMaskSet->n<=siz
3e80: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
3e90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3ea0: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
3eb0: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
3ec0: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
3ed0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
3ee0: 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  rn ((Bitmask)1)<
3ef0: 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  <i;.    }.  }.  
3f00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3f10: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
3f20: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
3f30: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
3f40: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
3f50: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
3f60: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
3f70: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
3f80: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
3f90: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
3fa0: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
3fb0: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
3fc0: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
3fd0: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
3fe0: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
3ff0: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
4000: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
4010: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
4020: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4030: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
4040: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
4050: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
4060: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
4070: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
4080: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
4090: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
40a0: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
40b0: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
40c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
40d0: 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73  ne walks (recurs
40e0: 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73  ively) an expres
40f0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65  sion tree and ge
4100: 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74  nerates.** a bit
4110: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
4120: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
4130: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
4140: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
4150: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
4160: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
4170: 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63  e to work, the c
4180: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
4190: 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65  must have.** pre
41a0: 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20  viously invoked 
41b0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
41c0: 70 72 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65  prNames() on the
41d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65   expression.  Se
41e0: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  e.** the header 
41f0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
4200: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
4210: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
4220: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  on..** The sqlit
4230: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
4240: 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f  es() routines lo
4250: 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  oks for column n
4260: 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73  ames and.** sets
4270: 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74   their opcodes t
4280: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
4290: 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c  their Expr.iTabl
42a0: 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74  e fields to.** t
42b0: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
42c0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62  umber of the tab
42d0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
42e0: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a  e just has to.**
42f0: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
4300: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
4310: 74 6f 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  to bitmask value
4320: 73 20 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20  s and OR all.** 
4330: 74 68 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67  the bitmasks tog
4340: 65 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ether..*/.static
4350: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73   Bitmask exprLis
4360: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4370: 65 4d 61 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c  eMaskSet*, ExprL
4380: 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ist*);.static Bi
4390: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
43a0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
43b0: 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74  MaskSet*, Select
43c0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
43d0: 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  sk exprTableUsag
43e0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
43f0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 2a  pMaskSet, Expr *
4400: 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61  p){.  Bitmask ma
4410: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d  sk = 0;.  if( p=
4420: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4430: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
4440: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73  OLUMN ){.    mas
4450: 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  k = getMask(pMas
4460: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29  kSet, p->iTable)
4470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73  ;.    return mas
4480: 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20  k;.  }.  mask = 
4490: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
44a0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67  MaskSet, p->pRig
44b0: 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ht);.  mask |= e
44c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
44d0: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74  askSet, p->pLeft
44e0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
44f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
4500: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
4510: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
4520: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
4530: 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65  askSet, p->x.pSe
4540: 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lect);.  }else{.
4550: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4560: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4570: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c  MaskSet, p->x.pL
4580: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ist);.  }.  retu
4590: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
45a0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
45b0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  stTableUsage(Whe
45c0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
45d0: 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Set, ExprList *p
45e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
45f0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
4600: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
4610: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4620: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
4630: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  i++){.      mask
4640: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4650: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
4660: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
4670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4680: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74  urn mask;.}.stat
4690: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
46a0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
46b0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
46c0: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a  askSet, Select *
46d0: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  pS){.  Bitmask m
46e0: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ask = 0;.  while
46f0: 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b  ( pS ){.    mask
4700: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4720: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
4730: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4740: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4750: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
4760: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
4770: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4780: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4790: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
47a0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
47b0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
47c0: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
47d0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
47e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
47f0: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
4800: 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e  );.    pS = pS->
4810: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  pPrior;.  }.  re
4820: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
4830: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
4840: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
4850: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
4860: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
4870: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
4880: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
4890: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
48a0: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
48b0: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
48c0: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
48d0: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e  , "<=", ">=", an
48e0: 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d  d "IN"..**.** IM
48f0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
4900: 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33 20 54   R-59926-26393 T
4910: 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79 20 61  o be usable by a
4920: 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d 20 6d  n index a term m
4930: 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65  ust be.** of one
4940: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4950: 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20  g forms: column 
4960: 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  = expression col
4970: 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69 6f 6e  umn > expression
4980: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78  .** column >= ex
4990: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
49a0: 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c  < expression col
49b0: 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73 69 6f  umn <= expressio
49c0: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
49d0: 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  = column express
49e0: 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70  ion > column exp
49f0: 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d  ression >= colum
4a00: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
4a10: 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  < column express
4a20: 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f  ion <= column co
4a30: 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72  lumn IN.** (expr
4a40: 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c  ession-list) col
4a50: 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65 72 79  umn IN (subquery
4a60: 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c  ) column IS NULL
4a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
4a80: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
4a90: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
4aa0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
4ab0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4ac0: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
4ad0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
4ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
4af0: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
4b00: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
4b10: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
4b20: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
4b30: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
4b40: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
4b50: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
4b60: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
4b70: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
4b80: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
4b90: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
4ba0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
4bb0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
4bc0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
4bd0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
4be0: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
4bf0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
4c00: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
4c10: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
4c20: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
4c30: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4c40: 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74  ence is associat
4c50: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74  ed with either t
4c60: 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74  he left or right
4c70: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
4c80: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
4c90: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
4ca0: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
4cb0: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
4cc0: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
4cd0: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
4ce0: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
4cf0: 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65  s .** "X collate
4d00: 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54   NOCASE op Y". T
4d10: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
4d20: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4d30: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
4d40: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
4d50: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
4d60: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
4d70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4d80: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
4d90: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
4da0: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
4db0: 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  he EP_ExpCollate
4dc0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
4dd0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
4de0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
4df0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
4e00: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4e10: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
4e20: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
4e30: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
4e40: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
4e50: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
4e60: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4e70: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4e80: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
4e90: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4ea0: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
4eb0: 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d  K_IN );.  pExpr-
4ec0: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d  >pRight->pColl =
4ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4ee0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4ef0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4f00: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4f10: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4f20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4f30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4f40: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
4f50: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4f60: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
4f70: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
4f80: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4f90: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4fa0: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4fb0: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
4fc0: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
4fd0: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
4fe0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4ff0: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
5000: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
5010: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
5020: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
5030: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
5040: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
5050: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5060: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
5070: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
5080: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
5090: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
50a0: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
50b0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
50c0: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
50d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
50e0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
50f0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
5100: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
5110: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
5120: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
5130: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
5140: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
5150: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
5160: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
5170: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
5180: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
5190: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
51a0: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
51b0: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
51c0: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
51d0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
51e0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
51f0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
5200: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5210: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
5220: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
5230: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
5240: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5250: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
5260: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
5270: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
5280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5290: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
52a0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
52b0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
52c0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
52d0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
52e0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
52f0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
5300: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
5310: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5320: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5340: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
5350: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
5360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
5370: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
5380: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5390: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
53a0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
53b0: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
53c0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
53d0: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
53e0: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
53f0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
5400: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
5410: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5420: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5430: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5440: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5450: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
5460: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
5470: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
5480: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
5490: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
54a0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
54b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
54c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
54d0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
54e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
54f0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
5500: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
5510: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
5520: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
5530: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
5540: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
5550: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
5560: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
5570: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
5580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5590: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
55a0: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
55b0: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
55c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
55d0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
55e0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
55f0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
5600: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
5610: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5620: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61  rm;.  int k;.  a
5630: 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29  ssert( iCur>=0 )
5640: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c  ;.  op &= WO_ALL
5650: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
5660: 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
5670: 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72  rm; k; k--, pTer
5680: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
5690: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
56a0: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20  =iCur.       && 
56b0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
56c0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
56d0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65  =0.       && pTe
56e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
56f0: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
5700: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
5710: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
5720: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
5730: 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65  pIdx && pTerm->e
5740: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e  Operator!=WO_ISN
5750: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ULL ){.        E
5760: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
5770: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
5780: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5790: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
57a0: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
57b0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
57c0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
57d0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
57e0: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
57f0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
5800: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
5810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
5820: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5830: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
5840: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
5850: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
5860: 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  out the collatio
5870: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69  n sequence requi
5880: 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65  red from an inde
5890: 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  x for.        **
58a0: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
58b0: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
58c0: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
58d0: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
58e0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
58f0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
5900: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5910: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
5920: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t);.        pCol
5930: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
5940: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
5950: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
5960: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
5970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5980: 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Coll || pParse->
5990: 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  nErr);..        
59a0: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
59b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
59c0: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
59d0: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
59e0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
59f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5a10: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
5a20: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5a30: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5a40: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
5a50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5a60: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
5a70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5a80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5a90: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5aa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5ab0: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5ac0: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
5ad0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
5ae0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
5af0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5b00: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5b10: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5b20: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5b30: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5b40: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5b50: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5b60: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5b70: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5b80: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5b90: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5ba0: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5bb0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5bc0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
5bd0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
5be0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
5bf0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
5c00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5c10: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5c20: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5c30: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5c40: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5c50: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5c60: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5c70: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5c80: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5c90: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5ca0: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5cb0: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
5cc0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
5cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
5ce0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
5cf0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
5d00: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
5d10: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
5d20: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5d30: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5d40: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5d60: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5d80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5d90: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5da0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5db0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5dc0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5dd0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
5de0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
5df0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
5e00: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
5e10: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5e20: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5e30: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5e40: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5e50: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5e60: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5e70: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5e80: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5e90: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5ea0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5eb0: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5ed0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5ee0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5ef0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5f00: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5f10: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5f20: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5f30: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5f40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5f50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5f60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5f70: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5f80: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5f90: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5fc0: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5fd0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5ff0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
6000: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
6010: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
6020: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
6030: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
6040: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
6050: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6060: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
6070: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6080: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
6090: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
60a0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60c0: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
60d0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
60e0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
60f0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
6100: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
6110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6120: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
6130: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
6140: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
6150: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
6160: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6170: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
6180: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
6190: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
61a0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69  K_COLUMN || sqli
61b0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
61c0: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
61d0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
61e0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
61f0: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
6200: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
6210: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
6220: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
6230: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
6240: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
6250: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
6260: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
6270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
6280: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
6290: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
62a0: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
62b0: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
62c0: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
62d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
62e0: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
62f0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
6300: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
6310: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
6320: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
6330: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6340: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
6350: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
6360: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
6370: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
6380: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
6390: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
63a0: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
63b0: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
63c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
63d0: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
63e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
63f0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
6400: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
6410: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
6420: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
6430: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6440: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
6450: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
6460: 2c 20 69 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a  , iCol); /* IMP:
6470: 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a   R-23257-02778 *
6480: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  /.    assert( pR
6490: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
64a0: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
64b0: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
64c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
64d0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
64e0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
64f0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
6500: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
6510: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
6520: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6530: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6540: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6550: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
6560: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
6570: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
6580: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
6590: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
65a0: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
65b0: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
65c0: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
65d0: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
65e0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
65f0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
6600: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
6610: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
6620: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
6630: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
6640: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
6650: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
6660: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
6670: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
6680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
6690: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
66a0: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
66b0: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f  ght->iColumn); /
66c0: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
66d0: 32 37 37 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  2778 */.        
66e0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
66f0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
6700: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
6710: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
6720: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
6730: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
6740: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
6750: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
6760: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
6770: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
6780: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
6790: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
67a0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
67b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
67c0: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
67d0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
67e0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
67f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
6800: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
6810: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
6820: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
6830: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
6840: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
6850: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
6860: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
6870: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
6880: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
6890: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
68a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
68b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
68c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
68d0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
68e0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
68f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6900: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
6910: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6920: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
6930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6940: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6950: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6960: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
6980: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
6990: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
69a0: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
69b0: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
69c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
69d0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
69e0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
69f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6a00: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6a10: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6a20: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6a30: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6a40: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
6a50: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
6a60: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
6a70: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
6a80: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
6a90: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
6aa0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
6ab0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
6ac0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
6ad0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
6ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
6af0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
6b00: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6b10: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6b20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6b30: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
6b40: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
6b50: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
6b60: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6b70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6b80: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6b90: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6ba0: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
6bb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6bc0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
6bd0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
6be0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
6bf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
6c00: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6c10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6c20: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
6c30: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
6c40: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
6c50: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
6c60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6c70: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
6c80: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
6c90: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
6ca0: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
6cb0: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
6cc0: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
6cd0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
6ce0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
6cf0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
6d00: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
6d10: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
6d20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
6d30: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
6d40: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
6d50: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
6d60: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
6d70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
6d80: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
6d90: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6da0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6db0: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
6dc0: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
6dd0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
6de0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
6df0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
6e00: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
6e10: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
6e20: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
6e30: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
6e40: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
6e70: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
6e80: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
6e90: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
6ea0: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
6eb0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
6ec0: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
6ed0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
6ee0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
6ef0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
6f00: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
6f10: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
6f20: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
6f30: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
6f40: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
6f50: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
6f60: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
6f70: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
6f80: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6f90: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
6fa0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
6fb0: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
6fc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
6fd0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
6fe0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
6ff0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
7000: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
7010: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
7020: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
7030: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
7040: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
7050: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
7060: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
7070: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
7080: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
7090: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
70a0: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
70b0: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
70c0: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
70d0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
70e0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
70f0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
7100: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
7110: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
7120: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7130: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7140: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
7150: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
7160: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
7170: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
7180: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
7190: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
71a0: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
71b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
71c0: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
71d0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
71e0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
71f0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
7200: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
7210: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
7220: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
7230: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7240: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
7250: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
7260: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
7270: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
7280: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
7290: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
72a0: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
72b0: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
72c0: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
72d0: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
72e0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
72f0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
7300: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
7310: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
7320: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
7330: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
7340: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7350: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
7360: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
7370: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
7380: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7390: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
73a0: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
73b0: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
73c0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
73d0: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
73e0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
73f0: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
7400: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
7410: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
7420: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7430: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
7440: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
7450: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
7460: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
7470: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
7480: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
7490: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
74a0: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
74b0: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
74c0: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
74d0: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
74e0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
74f0: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
7500: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
7510: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
7520: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
7530: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
7540: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
7550: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
7560: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
7570: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
7580: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
7590: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
75a0: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
75b0: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
75c0: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
75d0: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
75e0: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
75f0: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
7600: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
7610: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
7620: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
7630: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
7640: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
7650: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
7660: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7670: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
7680: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
7690: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
76a0: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
76b0: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
76c0: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
76d0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
76e0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
76f0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7700: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
7710: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
7720: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
7730: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
7740: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
7750: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
7760: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
7770: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
7780: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
7790: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
77a0: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
77b0: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
77c0: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
77d0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
77e0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
77f0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
7800: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
7810: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
7820: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
7830: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
7840: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
7850: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
7860: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
7870: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
7880: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
7890: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
78a0: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
78b0: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
78c0: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
78d0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
78e0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
78f0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
7900: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7910: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7920: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7930: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7940: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
7950: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
7960: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
7970: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
7980: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
7990: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
79a0: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
79b0: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
79c0: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
79d0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
79e0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
79f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7a00: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7a10: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7a20: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7a30: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7a40: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
7a50: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
7a60: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
7a70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7a80: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7aa0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
7ab0: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
7ac0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
7ad0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
7ae0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
7af0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7b00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7b10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7b20: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7b30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7b40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7b50: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7b60: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7b70: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7b80: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7b90: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7ba0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
7bb0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
7bc0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7bd0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
7be0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
7bf0: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
7c00: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7c10: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7c20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7c50: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
7c60: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
7c70: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
7c80: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
7c90: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
7ca0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
7cb0: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
7cc0: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
7cd0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
7ce0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
7cf0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
7d00: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
7d10: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
7d20: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
7d30: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
7d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7d50: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
7d60: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
7d70: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
7d80: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
7d90: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
7da0: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
7db0: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
7dc0: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
7dd0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
7de0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
7df0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
7e00: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
7e10: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
7e20: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
7e30: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
7e40: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
7e50: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
7e60: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
7e70: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
7e80: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
7e90: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
7ea0: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
7eb0: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
7ec0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
7ed0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
7ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
7ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
7f00: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
7f10: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
7f20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7f30: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
7f40: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
7f50: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
7f60: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
7f70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
7f80: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
7f90: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
7fa0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7fb0: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
7fc0: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
7fd0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57   whereSplit(pOrW
7fe0: 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29  c, pExpr, TK_OR)
7ff0: 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  ;.  exprAnalyzeA
8000: 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b  ll(pSrc, pOrWc);
8010: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
8020: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 57  ;.  assert( pOrW
8040: 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a  c->nTerm>=2 );..
8050: 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74    /*.  ** Comput
8060: 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  e the set of tab
8070: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
8080: 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20 6f  atisfy cases 1 o
8090: 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65  r 2..  */.  inde
80a0: 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73  xable = ~(Bitmas
80b0: 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20  k)0;.  chngToIN 
80c0: 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b  = ~(pWC->vmask);
80d0: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
80e0: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
80f0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
8100: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
8110: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8120: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
8130: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8140: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
8150: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
8160: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
8170: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8180: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20  m->eOperator==0 
8190: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
81a0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
81b0: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
81c0: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
81d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
81e0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
81f0: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
8200: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8210: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
8220: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
8230: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
8240: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
8250: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
8260: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
8270: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
8280: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
8290: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
82a0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
82b0: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
82c0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
82d0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
82e0: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
82f0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8300: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
8310: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
8320: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
8330: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
8340: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
8350: 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  WC, pWC->pParse,
8360: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20   pMaskSet);.    
8370: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
8380: 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e  AndWC, pOrTerm->
8390: 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a  pExpr, TK_AND);.
83a0: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
83b0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e  yzeAll(pSrc, pAn
83c0: 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65  dWC);.        te
83d0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
83e0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
83f0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8400: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8410: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8420: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
8430: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
8440: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
8450: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
8460: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
8470: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
8480: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
8490: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
84a0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
84c0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
84d0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
84e0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
84f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8500: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8510: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
8520: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
8530: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8540: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8550: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
8560: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
8570: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8580: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
8590: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
85a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
85b0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
85c0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
85d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
85e0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
85f0: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
8600: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8610: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8620: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8630: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8640: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
8650: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
8660: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
8670: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
8680: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
8690: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
86a0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
86b0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
86c0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
86d0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
86e0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
86f0: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
8700: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8710: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8720: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8730: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8740: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8750: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
8760: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8770: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
8780: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
8790: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
87a0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
87b0: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
87c0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
87d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
87e0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
87f0: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
8800: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
8810: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
8820: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
8830: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
8840: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
8850: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
8860: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
8870: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
8880: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
8890: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
88a0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
88b0: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
88c0: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
88d0: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
88e0: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
88f0: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
8900: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
8910: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
8920: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
8930: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
8940: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
8950: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
8960: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
8970: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
8980: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
8990: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
89a0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
89b0: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
89c0: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
89d0: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
89e0: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
89f0: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
8a00: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
8a10: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
8a20: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
8a30: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
8a40: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
8a50: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
8a60: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
8a70: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
8a80: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
8a90: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
8aa0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
8ab0: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
8ac0: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
8ad0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
8ae0: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
8af0: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
8b00: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
8b10: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
8b20: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
8b30: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
8b40: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8b50: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8b60: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8b70: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8b80: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8b90: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8ba0: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8bb0: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8bc0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8bd0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8be0: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
8bf0: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
8c00: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
8c10: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
8c20: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
8c30: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
8c40: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
8c50: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
8c60: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
8c70: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8c80: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
8c90: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
8ca0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
8cb0: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
8cc0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
8cd0: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
8ce0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
8cf0: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
8d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8d10: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
8d20: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
8d30: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8d50: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8d60: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
8d70: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
8d80: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
8d90: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
8da0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
8db0: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
8dc0: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
8dd0: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
8de0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
8df0: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
8e00: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
8e10: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
8e20: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
8e30: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
8e40: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
8e50: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
8e60: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
8e70: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
8e80: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
8e90: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
8ea0: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
8eb0: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
8ec0: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
8ed0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
8ee0: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
8ef0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
8f00: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
8f10: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8f20: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
8f30: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
8f40: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8f50: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8f60: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
8f70: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8f80: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
8f90: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
8fa0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
8fb0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
8fc0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
8fd0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
8fe0: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
8ff0: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
9000: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
9010: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
9020: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
9030: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
9040: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
9050: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
9060: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9070: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
9080: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
90a0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
90b0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
90c0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
90d0: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
90e0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
90f0: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
9100: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
9110: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
9120: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
9130: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
9140: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
9150: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
9160: 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65   either preceede
9170: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
9180: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
9190: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
91a0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
91b0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
91c0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
91d0: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
91e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
91f0: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9200: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9210: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9230: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9240: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9250: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9260: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
9270: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
9280: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
9290: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
92a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
92b0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
92c0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
92d0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
92e0: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
92f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9300: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9320: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9330: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9340: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9350: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9360: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
9370: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
9380: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
9390: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
93a0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
93b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 63 68       assert( (ch
93c0: 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e  ngToIN&(chngToIN
93d0: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
93e0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
93f0: 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61  oIN==getMask(pMa
9400: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
9410: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9420: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9430: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
9440: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
9450: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
9460: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
9470: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
9480: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
9490: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
94a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
94b0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
94c0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
94d0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
94e0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
94f0: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
9500: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
9510: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9520: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9530: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9540: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9550: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
9560: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
9570: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
9580: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
9590: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
95a0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
95b0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
95c0: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
95d0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
95e0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
95f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9600: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9610: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
9620: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
9630: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
9640: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
9650: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
9660: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
9670: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
9680: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
9690: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
96a0: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
96b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
96c0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
96d0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
96e0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
96f0: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
9700: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
9710: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9720: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
9730: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9740: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
9750: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
9760: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
9770: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9780: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
9790: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
97a0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
97b0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
97c0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
97d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
97e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
97f0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9800: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
9810: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9840: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
9850: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
9860: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
9870: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
9880: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
9890: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
98a0: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
98b0: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
98c0: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
98d0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
98e0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
98f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52   **.    ** EV: R
9900: 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20  -00211-15100.   
9910: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
9920: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
9930: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
9940: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
9950: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
9960: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
9970: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
9980: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
9990: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
99a0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
99b0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
99c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
99d0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
99e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
99f0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9a10: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
9a20: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
9a30: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
9a40: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
9a50: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
9a60: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
9a70: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
9a80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9a90: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
9aa0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9ab0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9ac0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
9ad0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
9ae0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
9af0: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
9b00: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
9b10: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
9b20: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
9b30: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
9b40: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9b50: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9b60: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9b70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9b80: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9b90: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
9ba0: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9bb0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9bc0: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9bd0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9bf0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
9c00: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
9c10: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9c20: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
9c30: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
9c40: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9c50: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
9c60: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
9c70: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
9c80: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
9c90: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
9ca0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
9cb0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9cc0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9cd0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
9ce0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
9cf0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
9d00: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
9d10: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
9d20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
9d30: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
9d40: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9d60: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
9d70: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
9d80: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
9d90: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
9da0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
9db0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
9dc0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
9dd0: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
9de0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
9df0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
9e00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9e20: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9e30: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
9e40: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
9e50: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
9e60: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
9e70: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
9e80: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
9e90: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
9ea0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
9eb0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
9ec0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f  _SUBQUERY */.../
9ed0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
9ee0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
9ef0: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
9f00: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
9f10: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
9f20: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
9f30: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
9f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
9f50: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
9f60: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
9f70: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
9f80: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
9f90: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
9fa0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
9fb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
9fc0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
9fd0: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
9fe0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
9ff0: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
a000: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
a010: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
a020: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
a030: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a040: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
a050: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
a060: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
a070: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
a080: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
a090: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
a0a0: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
a0b0: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
a0c0: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
a0d0: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
a0e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a0f0: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
a100: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
a110: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a120: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a130: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
a140: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
a150: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a160: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
a170: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
a180: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
a190: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
a1a0: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
a1b0: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
a1c0: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
a1d0: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
a1e0: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
a1f0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a200: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
a210: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
a220: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
a230: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
a240: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
a250: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
a260: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
a270: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
a280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a290: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
a2a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a2b0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
a2c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a2d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
a2e0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
a2f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
a300: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a310: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
a320: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
a350: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68  analyzed */.  Wh
a360: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
a370: 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  kSet;          /
a380: 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69  * Set of table i
a390: 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  ndex masks */.  
a3a0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3c0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
a3d0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
a3e0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
a3f0: 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20  rereqLeft;      
a400: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a410: 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20  quesites of the 
a420: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a  pExpr->pLeft */.
a430: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
a440: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
a450: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
a460: 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  tes of pExpr */.
a470: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52    Bitmask extraR
a480: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ight = 0;       
a490: 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65     /* Extra depe
a4a0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54  ndencies on LEFT
a4b0: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20   JOIN */.  Expr 
a4c0: 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20  *pStr1 = 0;     
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a4e0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a4f0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
a500: 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  t isComplete = 0
a510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a520: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
a530: 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c  OB ends with wil
a540: 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  dcard */.  int n
a550: 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  oCase = 0;      
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a570: 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67  IKE/GLOB disting
a580: 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20  uishes case */. 
a590: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
a5c0: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
a5d0: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
a5e0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
a5f0: 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72  arse;     /* Par
a600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a620: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
a630: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
a640: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
a650: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a660: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
a670: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
a680: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
a690: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
a6a0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
a6b0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
a6c0: 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71  >pExpr;.  prereq
a6d0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
a6e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a6f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
a700: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
a710: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
a720: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a730: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
a740: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
a750: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a760: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
a770: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
a780: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
a790: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
a7a0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
a7b0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
a7c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a7d0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a7e0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
a7f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a800: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
a810: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
a820: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
a830: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
a840: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
a850: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
a860: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a870: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
a880: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a890: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a8a0: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
a8b0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
a8c0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
a8d0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
a8e0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
a8f0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
a900: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
a910: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
a920: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
a930: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
a940: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
a950: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
a960: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
a970: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
a980: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
a990: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
a9b0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
a9c0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
a9d0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
a9e0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
a9f0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
aa00: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
aa10: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
aa20: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
aa30: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
aa40: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
aa50: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
aa60: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
aa70: 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c  qRight & prereqL
aa80: 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  eft)==0 ){.    E
aa90: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
aaa0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45  pr->pLeft;.    E
aab0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
aac0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
aad0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
aae0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
aaf0: 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75     pTerm->leftCu
ab00: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
ab10: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72  able;.      pTer
ab20: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
ab30: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
ab40: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  ;.      pTerm->e
ab50: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
ab60: 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20  torMask(op);.   
ab70: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
ab80: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
ab90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
aba0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
abb0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
abc0: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
abd0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
abe0: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
abf0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
ac00: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
ac10: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ac20: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
ac30: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ac40: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
ac50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ac60: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
ac70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ac80: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
ac90: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
aca0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
acb0: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
acc0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
acd0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
ace0: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
acf0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
ad00: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
ad10: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
ad20: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
ad30: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
ad40: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ad50: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ad60: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
ad70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
ad80: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
ad90: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
ada0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
adb0: 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20   pDup = pExpr;. 
adc0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
add0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
ade0: 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70     exprCommute(p
adf0: 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20  Parse, pDup);.  
ae00: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70      pLeft = pDup
ae10: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  ->pLeft;.      p
ae20: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
ae30: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
ae40: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c  .      pNew->u.l
ae50: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
ae60: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
ae70: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65    testcase( (pre
ae80: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
ae90: 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c  ight) != prereqL
aea0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  eft );.      pNe
aeb0: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
aec0: 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78   prereqLeft | ex
aed0: 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20  traRight;.      
aee0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
aef0: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
af00: 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74     pNew->eOperat
af10: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
af20: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
af30: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
af40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
af50: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
af60: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
af70: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
af80: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
af90: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
afa0: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
afb0: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
afc0: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
afd0: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46  N implements.  F
afe0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
aff0: 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54  .  **      a BET
b000: 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a  WEEN b AND c.  *
b010: 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72  *.  ** is conver
b020: 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  ted into:.  **. 
b030: 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57   **      (a BETW
b040: 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44  EEN b AND c) AND
b050: 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d   (a>=b) AND (a<=
b060: 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  c).  **.  ** The
b070: 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61   two new terms a
b080: 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  re added onto th
b090: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65  e end of the Whe
b0a0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e  reClause object.
b0b0: 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65  .  ** The new te
b0c0: 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63  rms are "dynamic
b0d0: 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72  " and are childr
b0e0: 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  en of the origin
b0f0: 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20  al BETWEEN.  ** 
b100: 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e  term.  That mean
b110: 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45  s that if the BE
b120: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f  TWEEN term is co
b130: 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65  ded, the childre
b140: 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70  n are.  ** skipp
b150: 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  ed.  Or, if the 
b160: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74  children are sat
b170: 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64  isfied by an ind
b180: 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ex, the original
b190: 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65  .  ** BETWEEN te
b1a0: 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  rm is skipped.. 
b1b0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
b1c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
b1d0: 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d  WEEN && pWC->op=
b1e0: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
b1f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
b200: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
b210: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b220: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
b230: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
b240: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
b250: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
b260: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
b270: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
b280: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
b290: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
b2a0: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b2b0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b2c0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
b2d0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b2e0: 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20  rse, ops[i], .  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b310: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
b320: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a  xpr->pLeft, 0),.
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b350: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b360: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
b370: 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  r, 0), 0);.     
b380: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b390: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b3a0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
b3b0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b3c0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
b3d0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
b3e0: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
b3f0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b400: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
b410: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b420: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
b430: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
b440: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
b460: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
b470: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b480: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
b490: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b4a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b4b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
b4c0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
b4d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b4e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
b4f0: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
b500: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
b510: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
b520: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
b530: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
b540: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
b550: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b560: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
b570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
b580: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
b590: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
b5a0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
b5b0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
b5c0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b5d0: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
b5e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b5f0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b600: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
b610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
b620: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
b630: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
b640: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
b650: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
b660: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
b670: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
b680: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
b690: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
b6a0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
b6b0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
b6c0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
b6d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
b6e0: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
b6f0: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
b700: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
b710: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
b720: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
b730: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
b740: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
b750: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
b760: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
b770: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
b780: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
b790: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
b7a0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
b7b0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
b7c0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
b7d0: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
b7e0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
b7f0: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
b800: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
b810: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
b820: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
b830: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
b840: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
b850: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
b860: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
b870: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
b880: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
b890: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
b8a0: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
b8b0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
b8c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
b8d0: 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  o use */..    pL
b8e0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
b8f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b900: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
b910: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b920: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b930: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
b940: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
b950: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
b960: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
b970: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
b980: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
b990: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
b9a0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
b9b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b9c0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
b9d0: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
b9e0: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
b9f0: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
ba00: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
ba10: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
ba20: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
ba30: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
ba40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
ba50: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
ba60: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
ba70: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
ba80: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
ba90: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
baa0: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
bab0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
bac0: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
bad0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
bae0: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
baf0: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
bb00: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
bb10: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
bb20: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
bb30: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
bb40: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
bb50: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
bb60: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
bb70: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
bb80: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
bb90: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
bba0: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
bbb0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
bbc0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
bbd0: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
bbe0: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
bbf0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
bc00: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
bc10: 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
bc20: 55 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22  UTF8, noCase ? "
bc30: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
bc40: 59 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  Y",0);.    pNewE
bc50: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
bc60: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
bc70: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
bc80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bc90: 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69  ExprSetColl(sqli
bca0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
bcb0: 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a  eft,0), pColl),.
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
bce0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
bcf0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
bd00: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
bd10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
bd20: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
bd30: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
bd40: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
bd50: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
bd60: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
bd70: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
bd80: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bd90: 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
bdb0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
bdc0: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
bdd0: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
bde0: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
bdf0: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
be00: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
be10: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
be20: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
be30: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
be40: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
be50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
be60: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
be70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
be80: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
be90: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
bea0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
beb0: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
bec0: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
bed0: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
bee0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
bef0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
bf00: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
bf10: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
bf20: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
bf30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bf40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bf50: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
bf60: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
bf70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
bf80: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
bf90: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
bfa0: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
bfb0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
bfc0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
bfd0: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
bfe0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
bff0: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
c000: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
c010: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
c020: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
c030: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
c040: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
c050: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
c060: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
c070: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
c080: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
c090: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
c0a0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
c0b0: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
c0c0: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
c0d0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c0e0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
c0f0: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
c100: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
c110: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
c120: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
c130: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
c140: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
c150: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c160: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
c170: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
c180: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
c190: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
c1a0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
c1b0: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
c1c0: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
c1d0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c1e0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
c1f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
c200: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
c210: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
c220: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
c230: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
c240: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c250: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
c260: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
c290: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
c2a0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
c2b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c2c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c2d0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
c2e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c2f0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c300: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
c310: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
c320: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
c330: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c340: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
c350: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
c360: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c370: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c380: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c390: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c3a0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c3b0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c3c0: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c3d0: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
c3e0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
c3f0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
c400: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
c410: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c420: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
c430: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
c440: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c450: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
c460: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c470: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c480: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c490: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
c4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
c4b0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
c4c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c4d0: 45 5f 53 54 41 54 32 0a 20 20 2f 2a 20 57 68 65  E_STAT2.  /* Whe
c4e0: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 68  n sqlite_stat2 h
c4f0: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
c500: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
c510: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
c520: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
c530: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
c540: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
c550: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
c560: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
c570: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
c580: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c590: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
c5a0: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
c5b0: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
c5c0: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
c5d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
c5e0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
c5f0: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
c600: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
c610: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
c620: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
c630: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
c640: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
c650: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
c660: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
c670: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
c680: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
c690: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
c6a0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
c6b0: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
c6c0: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
c6d0: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
c6e0: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
c6f0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c700: 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 78  K_NOTNULL && pEx
c710: 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pr->pLeft->iColu
c720: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  mn>=0 ){.    Exp
c730: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
c740: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
c750: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
c760: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
c770: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
c780: 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45  Term;..    pNewE
c790: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
c7a0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 54  pr(pParse, TK_GT
c7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c7d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c7e0: 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20   pLeft, 0),.    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
c810: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c820: 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20  NULL, 0, 0, 0), 
c830: 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20  0);..    idxNew 
c840: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
c850: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
c860: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c890: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
c8a0: 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20  VNULL);.    if( 
c8b0: 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  idxNew ){.      
c8c0: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
c8d0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
c8e0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c8f0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  eqRight = 0;.   
c900: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
c910: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
c920: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
c930: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
c940: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
c950: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
c960: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
c970: 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20  r = WO_GT;.     
c980: 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65   pNewTerm->iPare
c990: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
c9a0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
c9b0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
c9c0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c9d0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65  d = 1;.      pTe
c9e0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
c9f0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
ca00: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
ca10: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
ca20: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
ca30: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
ca40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
ca50: 32 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  2 */..  /* Preve
ca60: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
ca70: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
ca80: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
ca90: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
caa0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
cab0: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
cac0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
cad0: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
cae0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
caf0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ight;.}../*.** R
cb00: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e  eturn TRUE if an
cb10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
cb20: 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ions in pList->a
cb30: 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74  [iFirst...] cont
cb40: 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  ain.** a referen
cb50: 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20  ce to any table 
cb60: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69  other than the i
cb70: 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  Base table..*/.s
cb80: 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72 65  tatic int refere
cb90: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
cba0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cbb0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st,          /* 
cbc0: 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69 6f  Search expressio
cbd0: 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a  ns in ths list *
cbe0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
cbf0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a   *pMaskSet,   /*
cc00: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
cc10: 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20  bles to bitmaps 
cc20: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc40: 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20 77  * Be searching w
cc50: 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d 74  ith the iFirst-t
cc60: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  h expression */.
cc70: 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20 20    int iBase     
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cc90: 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73  gnore references
cca0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
ccb0: 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61  /.){.  Bitmask a
ccc0: 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73  llowed = ~getMas
ccd0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73  k(pMaskSet, iBas
cce0: 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69  e);.  while( iFi
ccf0: 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rst<pList->nExpr
cd00: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70   ){.    if( (exp
cd10: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
cd20: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
cd30: 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26  First++].pExpr)&
cd40: 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20  allowed)!=0 ){. 
cd50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
cd60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
cd70: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
cd80: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69  his routine deci
cd90: 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  des if pIdx can 
cda0: 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73  be used to satis
cdb0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  fy the ORDER BY.
cdc0: 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69  ** clause.  If i
cdd0: 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e  t can, it return
cde0: 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61  s 1.  If pIdx ca
cdf0: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
ce00: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
ce10: 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  use, this routin
ce20: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
ce30: 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
ce40: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
ce50: 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20  e from a SELECT 
ce60: 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62  statement.  pTab
ce70: 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d   is the.** left-
ce80: 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68  most table in th
ce90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
cea0: 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43   that same SELEC
ceb0: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a  T statement and.
cec0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  ** the table has
ced0: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
cee0: 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
cef0: 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  x is an index on
cf00: 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71   pTab..**.** nEq
cf10: 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
cf20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
cf30: 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73  pIdx that are us
cf40: 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a  ed as equality.*
cf50: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  * constraints.  
cf60: 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c  Any of these col
cf70: 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73  umns may be miss
cf80: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ing from the ORD
cf90: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20  ER BY.** clause 
cfa0: 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61  and the match ca
cfb0: 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63  n still be a suc
cfc0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  cess..**.** All 
cfd0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
cfe0: 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68  ER BY that match
cff0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
d000: 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ex must be eithe
d010: 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43  r.** ASC or DESC
d020: 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65  .  (Terms of the
d030: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d040: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
d050: 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64   a UNIQUE.** ind
d060: 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ex do not need t
d070: 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63  o satisfy this c
d080: 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65  onstraint.)  The
d090: 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73   *pbRev value is
d0a0: 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20  .** set to 1 if 
d0b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d0c0: 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20  use is all DESC 
d0d0: 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f  and it is set to
d0e0: 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44   0 if.** the ORD
d0f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
d100: 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74  all ASC..*/.stat
d110: 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67  ic int isSorting
d120: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
d130: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d140: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d150: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ext */.  WhereMa
d160: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
d170: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
d180: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75   table cursor nu
d190: 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70 73  mbers to bitmaps
d1a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
d1b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
d1c0: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
d1d0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
d1e0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
d1f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
d200: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
d210: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
d220: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
d230: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
d240: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
d250: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
d260: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
d270: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d280: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
d290: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
d2a0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c  ts */.  int wsFl
d2b0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
d2c0: 2f 2a 20 49 6e 64 65 78 20 75 73 61 67 65 73 20  /* Index usages 
d2d0: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
d2e0: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
d2f0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
d300: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
d310: 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  SC */.){.  int i
d320: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
d330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d340: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
d350: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d   int sortOrder =
d360: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d370: 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78   /* XOR of index
d380: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f   and ORDER BY so
d390: 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a  rt direction */.
d3a0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
d3d0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
d3e0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
d3f0: 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20  st_item *pTerm; 
d400: 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20     /* A term of 
d410: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d420: 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  use */.  sqlite3
d430: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d440: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  b;..  assert( pO
d450: 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e  rderBy!=0 );.  n
d460: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
d470: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
d480: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
d490: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  /* Argument pIdx
d4a0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
d4b0: 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e  nt to a 'real' n
d4c0: 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63  amed index struc
d4d0: 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61  ture, .  ** or a
d4e0: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
d4f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  e allocated on t
d500: 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74  he stack by best
d510: 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a  BtreeIndex() to.
d520: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74    ** represent t
d530: 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74  he rowid index t
d540: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65  hat is part of e
d550: 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  very table.  */.
d560: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
d570: 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e  zName || (pIdx->
d580: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
d590: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
d5a0: 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =-1) );..  /* Ma
d5b0: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
d5c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d5d0: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
d5e0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
d5f0: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
d600: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
d610: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
d620: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
d630: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
d640: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
d650: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
d660: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
d670: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
d680: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
d690: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
d6a0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
d6b0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
d6c0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
d6d0: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
d6e0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
d6f0: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
d700: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
d710: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
d720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
d730: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
d740: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
d750: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
d760: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
d770: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
d780: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
d790: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
d7a0: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
d7b0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
d7c0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
d7d0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
d7e0: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
d7f0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
d800: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
d810: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
d820: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
d830: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
d840: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
d850: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
d860: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
d870: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
d880: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d890: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
d8a0: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
d8b0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
d8c0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
d8d0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
d8e0: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
d8f0: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
d900: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
d910: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
d920: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
d930: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
d940: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
d950: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
d960: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
d970: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
d980: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
d990: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
d9a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
d9b0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
d9c0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
d9d0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
d9e0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
d9f0: 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26  f( pIdx->zName &
da00: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
da10: 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
da20: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
da30: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
da40: 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
da50: 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
da60: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
da70: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
da80: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
da90: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
daa0: 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
dab0: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
dac0: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
dad0: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
dae0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
daf0: 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
db00: 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
db10: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
db20: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
db30: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
db40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
db50: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
db60: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
db70: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
db80: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
db90: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
dba0: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
dbb0: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
dbc0: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
dbd0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
dbe0: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
dbf0: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
dc00: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
dc10: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
dc20: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
dc30: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
dc40: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
dc50: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
dc60: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
dc70: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
dc80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dc90: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
dca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
dcb0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
dcc0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
dcd0: 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
dce0: 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
dd00: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
dd10: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
dd20: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
dd30: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
dd40: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
dd50: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
dd60: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
dd70: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
dd80: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
dd90: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dda0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ddb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
ddc0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
ddd0: 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f  tOrder!=0 || iCo
dde0: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  lumn==-1 );.    
ddf0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73  assert( pTerm->s
de00: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
de10: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
de20: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
de30: 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( iSortOrder==0 
de40: 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31  || iSortOrder==1
de50: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
de60: 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64  Order = iSortOrd
de70: 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  er ^ pTerm->sort
de80: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
de90: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
dea0: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
deb0: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
dec0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
ded0: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
dee0: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
def0: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
df00: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
df10: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
df20: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
df30: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
df40: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
df50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
df60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
df70: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
df80: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
df90: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
dfa0: 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  m++;.    if( iCo
dfb0: 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72  lumn<0 && !refer
dfc0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
dfd0: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
dfe0: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
dff0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
e000: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
e010: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
e020: 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e  ey and everythin
e030: 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20  g matches.      
e040: 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f  ** so far and no
e050: 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
e060: 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  BY terms to the 
e070: 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20  right reference 
e080: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  other.      ** t
e090: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
e0a0: 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  n, then we are a
e0b0: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
e0c0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
e0d0: 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73  d .      ** to s
e0e0: 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ort because the 
e0f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
e100: 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e  nique and so non
e110: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20  e of the other. 
e120: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
e130: 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69  will make any di
e140: 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  fference.      *
e150: 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72  /.      j = nTer
e160: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
e170: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
e180: 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d  er!=0;.  if( j>=
e190: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  nTerm ){.    /* 
e1a0: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
e1b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e1c0: 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
e1d0: 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20  this index so.  
e1e0: 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20    ** this index 
e1f0: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
e200: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  sorting. */.    
e210: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
e220: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
e230: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d  r!=OE_None && i=
e240: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  =pIdx->nColumn. 
e250: 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
e260: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
e270: 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26  NULL)==0.      &
e280: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
e290: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
e2a0: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
e2b0: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  base) ){.    /* 
e2c0: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69  All terms of thi
e2d0: 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f  s index match so
e2e0: 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  me prefix of the
e2f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e300: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
e310: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20  index is UNIQUE 
e320: 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20  and no terms on 
e330: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
e340: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
e350: 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65  clause reference
e360: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
e370: 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69   a join.  If thi
e380: 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68  s is all true th
e390: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  en.    ** the or
e3a0: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73  der by clause is
e3b0: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e   superfluous.  N
e3c0: 6f 74 20 74 68 61 74 20 69 66 20 74 68 65 20 6d  ot that if the m
e3d0: 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63  atching.    ** c
e3e0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e  ondition is IS N
e3f0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
e400: 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ult is not neces
e410: 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20  sarily unique.  
e420: 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55    ** even on a U
e430: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20  NIQUE index, so 
e440: 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63  disallow those c
e450: 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ases. */.    ret
e460: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
e470: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e480: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
e490: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
e4a0: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
e4b0: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
e4c0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
e4d0: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
e4e0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
e4f0: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
e500: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
e510: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
e520: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
e530: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
e540: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
e550: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
e560: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
e570: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
e580: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
e590: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
e5a0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
e5b0: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
e5c0: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
e5d0: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
e5e0: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
e5f0: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
e600: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
e610: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
e620: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
e630: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
e640: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
e650: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
e660: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e670: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
e680: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e690: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
e6a0: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
e6b0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
e6c0: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
e6d0: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
e6e0: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
e6f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
e700: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
e710: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
e720: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
e730: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
e740: 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
e750: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
e760: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
e770: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
e780: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
e790: 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
e7a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
e7b0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
e7c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
e7d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e7e0: 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
e7f0: 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
e800: 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
e810: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e820: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
e830: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
e840: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
e850: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
e860: 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
e870: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
e880: 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
e890: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
e8a0: 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
e8b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
e8c0: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
e8d0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e8e0: 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
e8f0: 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
e900: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
e910: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
e920: 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
e930: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
e940: 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
e950: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
e960: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
e970: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
e980: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
e990: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
e9a0: 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
e9b0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
e9c0: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
e9d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
e9e0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e9f0: 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
ea00: 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
ea10: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
ea20: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
ea30: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
ea40: 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
ea50: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
ea60: 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
ea70: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
ea80: 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
ea90: 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
eaa0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
eab0: 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
eac0: 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
ead0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
eae0: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
eaf0: 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
eb00: 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
eb10: 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
eb20: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
eb30: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
eb40: 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
eb50: 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
eb60: 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
eb70: 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
eb80: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
eb90: 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
eba0: 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64  ./* .** Required
ebb0: 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64   because bestInd
ebc0: 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ex() is called b
ebd0: 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  y bestOrClauseIn
ebe0: 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63  dex() .*/.static
ebf0: 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
ec00: 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65  .    Parse*, Whe
ec10: 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63  reClause*, struc
ec20: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
ec30: 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69  .    Bitmask, Bi
ec40: 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a  tmask, ExprList*
ec50: 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a  , WhereCost*);..
ec60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ec70: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
ec80: 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20  ind an scanning 
ec90: 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61  strategy that ca
eca0: 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  n be used .** to
ecb0: 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52   optimize an 'OR
ecc0: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ' expression tha
ecd0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57  t is part of a W
ece0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a  HERE clause. .**
ecf0: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73  .** The table as
ed00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52  sociated with FR
ed10: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
ed20: 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65  Src may be eithe
ed30: 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42  r a.** regular B
ed40: 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61  -Tree table or a
ed50: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
ed60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
ed70: 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
ed80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ed90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
eda0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
edb0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
edc0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
edd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
ede0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
edf0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
ee00: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
ee10: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
ee20: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
ee30: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
ee40: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
ee50: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
ee60: 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
ee70: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
ee80: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
ee90: 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
eea0: 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
eeb0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
eec0: 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
eed0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
eee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
eef0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ef00: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
ef10: 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
ef20: 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
ef30: 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
ef40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ef50: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ef60: 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74  TION.  const int
ef70: 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
ef80: 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
ef90: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
efa0: 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
efb0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  ed */.  const Bi
efc0: 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
efd0: 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
efe0: 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
eff0: 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
f000: 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
f010: 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
f020: 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
f030: 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
f040: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
f050: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
f060: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
f070: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
f080: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
f090: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
f0a0: 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61  ..  /* No OR-cla
f0b0: 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
f0c0: 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
f0d0: 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
f0e0: 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
f0f0: 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20  s.  ** are used 
f100: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
f110: 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72  otIndexed || pSr
f120: 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  c->pIndex!=0 ){.
f130: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f140: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65  .  /* Search the
f150: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f160: 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65  rms for a usable
f170: 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a   WO_OR term. */.
f180: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
f190: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
f1a0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
f1b0: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
f1c0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
f1d0: 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72    && ((pTerm->pr
f1e0: 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53  ereqAll & ~maskS
f1f0: 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  rc) & notReady)=
f200: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
f210: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
f220: 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
f230: 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  c)!=0 .    ){.  
f240: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
f250: 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
f260: 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
f270: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
f280: 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
f290: 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
f2a0: 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
f2b0: 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
f2c0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
f2d0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57     int flags = W
f2e0: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
f2f0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
f300: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  al = 0;.      do
f310: 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  uble nRow = 0;. 
f320: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65       Bitmask use
f330: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f  d = 0;..      fo
f340: 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
f350: 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
f360: 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
f370: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
f380: 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20  ost sTermCost;. 
f390: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
f3a0: 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
f3b0: 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
f3c0: 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
f3d0: 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
f3e0: 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
f3f0: 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
f400: 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
f410: 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
f420: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
f430: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
f440: 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
f450: 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d  Clause *pAndWC =
f460: 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
f470: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
f480: 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70       bestIndex(p
f490: 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70  Parse, pAndWC, p
f4a0: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
f4b0: 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65  otValid, 0, &sTe
f4c0: 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rmCost);.       
f4d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
f4e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
f4f0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
f500: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
f510: 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
f520: 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20  tempWC.pParse = 
f530: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pWC->pParse;.   
f540: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4d         tempWC.pM
f550: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
f560: 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20 20  askSet;.        
f570: 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
f580: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
f590: 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
f5a0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  rm;.          te
f5b0: 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
f5c0: 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
f5d0: 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65 6d  dex(pParse, &tem
f5e0: 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
f5f0: 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30  ady, notValid, 0
f600: 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
f610: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f620: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f630: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f640: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54      rTotal += sT
f650: 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  ermCost.rCost;. 
f660: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
f670: 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52  TermCost.plan.nR
f680: 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
f690: 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75 73   |= sTermCost.us
f6a0: 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
f6b0: 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72  rTotal>=pCost->r
f6c0: 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  Cost ) break;.  
f6d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
f6e0: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
f6f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
f700: 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61  increase the sca
f710: 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e  n cost to accoun
f720: 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  t .      ** for 
f730: 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
f740: 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sort. */.      i
f750: 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  f( pOrderBy!=0 )
f760: 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  {.        WHERET
f770: 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
f780: 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20  ng increases OR 
f790: 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e 39  cost %.9g to %.9
f7a0: 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
f7b0: 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c            rTotal
f7c0: 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73  , rTotal+nRow*es
f7d0: 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20 20  tLog(nRow)));.  
f7e0: 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
f7f0: 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
f800: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
f810: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74    /* If the cost
f820: 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69   of scanning usi
f830: 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20  ng this OR term 
f840: 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  for optimization
f850: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73   is.      ** les
f860: 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
f870: 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69  nt cost stored i
f880: 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65  n pCost, replace
f890: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
f8a0: 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e      ** of pCost.
f8b0: 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
f8c0: 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69  RACE(("... multi
f8d0: 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25  -index OR cost=%
f8e0: 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22  .9g nrow=%.9g\n"
f8f0: 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29  , rTotal, nRow))
f900: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74  ;.      if( rTot
f910: 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  al<pCost->rCost 
f920: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  ){.        pCost
f930: 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c  ->rCost = rTotal
f940: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
f950: 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20  >used = used;.  
f960: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
f970: 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  n.nRow = nRow;. 
f980: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
f990: 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61  an.wsFlags = fla
f9a0: 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  gs;.        pCos
f9b0: 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  t->plan.u.pTerm 
f9c0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
f9d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f9e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f9f0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
fa00: 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
fa10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
fa20: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
fa30: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
fa40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
fa50: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
fa60: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
fa70: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
fa80: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
fa90: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
faa0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
fab0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
fac0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
fad0: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
fae0: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
faf0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
fb20: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
fb30: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
fb40: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
fb50: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
fb60: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
fb70: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
fb80: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
fb90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
fba0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
fbb0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
fbc0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
fbd0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
fbe0: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
fbf0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
fc00: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
fc10: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72 65  ator!=WO_EQ ) re
fc20: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
fc30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
fc40: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
fc50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
fc60: 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  ff = pSrc->pTab-
fc70: 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c  >aCol[pTerm->u.l
fc80: 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  eftColumn].affin
fc90: 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ity;.  if( !sqli
fca0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
fcb0: 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  Ok(pTerm->pExpr,
fcc0: 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30   aff) ) return 0
fcd0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
fce0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
fcf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fd00: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
fd10: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 70  * If the query p
fd20: 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70 65  lan for pSrc spe
fd30: 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74 20  cified in pCost 
fd40: 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  is a full table 
fd50: 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64 65  scan.** and inde
fd60: 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20 28  xing is allows (
fd70: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e  if there is no N
fd80: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
fd90: 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f 73  e) and it.** pos
fda0: 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72 75  sible to constru
fdb0: 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  ct a transient i
fdc0: 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64 20  ndex that would 
fdd0: 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a 2a  perform better.*
fde0: 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61  * than a full ta
fdf0: 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77 68  ble scan even wh
fe00: 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 63  en the cost of c
fe10: 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
fe20: 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b 65  index.** is take
fe30: 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20  n into account, 
fe40: 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20 71  then alter the q
fe50: 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73 65  uery plan to use
fe60: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e   the.** transien
fe70: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
fe80: 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74 6f  ic void bestAuto
fe90: 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
fea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
feb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fec0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
fed0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
fee0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
fef0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
ff00: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
ff10: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
ff20: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
ff30: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
ff40: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
ff50: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
ff60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
ff70: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
ff80: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
ff90: 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ble */.  WhereCo
ffa0: 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
ffb0: 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
ffc0: 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
ffd0: 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e 54  /.){.  double nT
ffe0: 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20  ableRow;        
fff0: 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68     /* Rows in th
10000 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a 2f  e input table */
10010 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20  .  double logN; 
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10030 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
10040 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
10050 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
10060 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
10070 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
10080 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
10090 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
100a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
100b0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
100c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
100d0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
100e0 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
100f0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
10100 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
10110 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
10120 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
10130 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
10140 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  xed */..  if( (p
10150 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
10160 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   & SQLITE_AutoIn
10170 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  dex)==0 ){.    /
10180 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69  * Automatic indi
10190 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ces are disabled
101a0 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a   at run-time */.
101b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
101c0 20 20 69 66 28 20 28 70 43 6f 73 74 2d 3e 70 6c    if( (pCost->pl
101d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
101e0 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
101f0 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  !=0 ){.    /* We
10200 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73 6f   already have so
10210 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78  me kind of index
10220 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73   in use for this
10230 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72   query. */.    r
10240 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10250 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
10260 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
10270 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
10280 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  se appears in th
10290 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65  e SQL. */.    re
102a0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  turn;.  }..  ass
102b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ert( pParse->nQu
102c0 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62  eryLoop >= (doub
102d0 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65  le)1 );.  pTable
102e0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
102f0 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61   nTableRow = pTa
10300 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
10310 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54  logN = estLog(nT
10320 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74  ableRow);.  cost
10330 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e  TempIdx = 2*logN
10340 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72  *(nTableRow/pPar
10350 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
10360 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54   1);.  if( costT
10370 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72  empIdx>=pCost->r
10380 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Cost ){.    /* T
10390 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74  he cost of creat
103a0 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
103b0 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65  t table would be
103c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
103d0 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66    ** doing the f
103e0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
103f0 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
10400 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
10410 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20  or any equality 
10420 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20  comparison term 
10430 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  */.  pWCEnd = &p
10440 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
10450 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ];.  for(pTerm=p
10460 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
10470 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
10480 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
10490 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
104a0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
104b0 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
104c0 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78  ACE(("auto-index
104d0 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66 72   reduces cost fr
104e0 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c  om %.1f to %.1f\
104f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10500 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72          pCost->r
10510 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64  Cost, costTempId
10520 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  x));.      pCost
10530 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65  ->rCost = costTe
10540 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f  mpIdx;.      pCo
10550 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  st->plan.nRow = 
10560 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20  logN + 1;.      
10570 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
10580 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50  ags = WHERE_TEMP
10590 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 43  _INDEX;.      pC
105a0 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65 72  ost->used = pTer
105b0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
105c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
105d0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
105e0 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f   define bestAuto
105f0 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c 43  maticIndex(A,B,C
10600 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,D,E)  /* no-op 
10610 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
10620 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
10630 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69  IC_INDEX */...#i
10640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10650 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
10660 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
10670 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
10680 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
10690 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
106a0 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
106b0 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
106c0 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
106d0 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
106e0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
106f0 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
10700 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
10710 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
10720 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
10730 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
10740 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10760 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
10770 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
10780 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
10790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
107a0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
107b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
107c0 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
107d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
107e0 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
107f0 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
10800 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
10810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10820 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
10830 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
10840 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
10850 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
10860 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
10870 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
10880 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
10890 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
108a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
108b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
108c0 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
108d0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
108e0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
108f0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
10900 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
10910 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
10920 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
10930 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
10940 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
10950 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
10960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
10970 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
10980 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
10990 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109b0 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
109c0 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
109d0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
109e0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
109f0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
10a00 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
10a10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10a20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 73 49   */.  int regIsI
10a30 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
10a40 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 65    /* Register se
10a50 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  t by initializat
10a60 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
10a70 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
10a80 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10a90 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
10aa0 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
10ab0 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
10ac0 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
10ad0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
10ae0 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
10af0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10b00 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
10b10 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
10b20 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
10b30 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
10b40 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
10b50 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
10b60 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
10b70 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
10b80 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
10b90 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
10ba0 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
10bb0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
10bc0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
10be0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
10bf0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10c10 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10c20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
10c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10c40 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
10c50 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
10c60 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
10c70 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
10c80 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
10c90 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
10ca0 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  lumn */.  Bitmas
10cb0 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
10cc0 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
10cd0 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
10ce0 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
10cf0 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
10d00 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
10d10 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
10d20 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
10d30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
10d40 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
10d50 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
10d60 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
10d70 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
10d80 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
10d90 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
10da0 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
10db0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
10dc0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
10dd0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
10de0 3d 30 20 29 3b 0a 20 20 72 65 67 49 73 49 6e 69  =0 );.  regIsIni
10df0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
10e00 65 6d 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d  em;.  addrInit =
10e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e20 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
10e30 49 73 49 6e 69 74 29 3b 0a 20 20 73 71 6c 69 74  IsInit);.  sqlit
10e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
10e60 65 67 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a  egIsInit);..  /*
10e70 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
10e80 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
10e90 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
10ea0 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
10eb0 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
10ec0 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
10ed0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
10ee0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
10ef0 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
10f00 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
10f10 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
10f20 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20  erm];.  idxCols 
10f30 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
10f40 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
10f50 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
10f60 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
10f70 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
10f80 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
10f90 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
10fa0 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
10fb0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
10fc0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
10fd0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
10fe0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
10ff0 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
11000 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74  )<<iCol;.      t
11010 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
11020 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
11030 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
11040 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  1 );.      if( (
11050 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
11060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ==0 ){.        n
11070 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
11080 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
11090 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
110a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
110b0 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70  nColumn>0 );.  p
110c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20  Level->plan.nEq 
110d0 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a  = nColumn;..  /*
110e0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
110f0 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
11100 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
11110 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
11120 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
11130 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
11140 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
11150 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
11160 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
11170 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
11180 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
11190 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
111a0 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
111b0 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
111c0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
111d0 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
111e0 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
111f0 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
11200 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
11210 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
11220 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
11230 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
11240 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
11250 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
11260 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
11270 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
11280 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
11290 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
112a0 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
112b0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
112c0 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69  ~idxCols | (((Bi
112d0 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
112e0 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  )));.  mxBitCol 
112f0 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  = (pTable->nCol 
11300 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d  >= BMS-1) ? BMS-
11310 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  1 : pTable->nCol
11320 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
11330 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
11340 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
11350 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
11360 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d  MS-2 );.  for(i=
11370 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
11380 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
11390 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d  raCols & (((Bitm
113a0 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f  ask)1)<<i) ) nCo
113b0 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  lumn++;.  }.  if
113c0 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
113d0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
113e0 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
113f0 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62   nColumn += pTab
11400 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b  le->nCol - BMS +
11410 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c   1;.  }.  pLevel
11420 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
11430 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
11440 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
11450 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f  LY | WO_EQ;..  /
11460 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
11470 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
11480 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
11490 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d  dex */.  nByte =
114a0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a   sizeof(Index);.
114b0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
114c0 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20  mn*sizeof(int); 
114d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
114e0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65  olumn */.  nByte
114f0 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
11500 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20  of(char*);   /* 
11510 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a  Index.azColl */.
11520 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
11530 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
11540 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
11550 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64  rtOrder */.  pId
11560 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
11570 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
11580 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
11590 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
115a0 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c  rn;.  pLevel->pl
115b0 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78  an.u.pIdx = pIdx
115c0 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
115d0 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
115e0 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
115f0 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11600 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
11610 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
11620 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
11630 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
11640 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
11650 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
11660 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
11670 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
11680 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
11690 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
116a0 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
116b0 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
116c0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
116d0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
116e0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
116f0 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
11700 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
11710 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
11720 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
11730 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
11740 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
11750 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
11760 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
11770 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
11780 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  <<iCol;.      if
11790 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
117a0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
117b0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
117c0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
117d0 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
117e0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
117f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
11800 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
11810 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
11820 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
11830 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
11840 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
11850 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
11860 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
11870 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
11880 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
11890 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
118a0 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
118b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
118c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
118d0 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c  32)n==pLevel->pl
118e0 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  an.nEq );..  /* 
118f0 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
11900 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
11910 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
11920 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
11930 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
11940 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
11950 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
11960 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
11970 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d  raCols & (((Bitm
11980 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20  ask)1)<<i) ){.  
11990 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
119a0 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
119b0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
119c0 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
119d0 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
119e0 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
119f0 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61  lUsed & (((Bitma
11a00 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
11a10 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
11a20 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
11a30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
11a40 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
11a50 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
11a60 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
11a70 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
11a80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
11a90 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75  assert( n==nColu
11aa0 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  mn );..  /* Crea
11ab0 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
11ac0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79   index */.  pKey
11ad0 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  info = sqlite3In
11ae0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
11af0 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65  e, pIdx);.  asse
11b00 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
11b10 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Cur>=0 );.  sqli
11b20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11b30 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
11b40 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
11b50 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30  ur, nColumn+1, 0
11b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11b70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
11b80 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yinfo, P4_KEYINF
11b90 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64  O_HANDOFF);.  Vd
11ba0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
11bb0 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
11bc0 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
11bd0 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
11be0 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
11bf0 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
11c00 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
11c10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
11c20 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
11c30 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
11c40 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
11c50 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
11c60 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
11c70 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
11c80 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
11c90 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
11ca0 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 1);.  sqlite3
11cb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11cc0 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
11cd0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
11ce0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
11cf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11d00 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
11d10 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
11d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11d30 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d  OP_Next, pLevel-
11d40 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f  >iTabCur, addrTo
11d50 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  p+1);.  sqlite3V
11d60 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
11d70 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
11d80 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
11d90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11da0 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
11db0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11dc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11dd0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20  regRecord);.  . 
11de0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
11df0 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
11e00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
11e10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
11e20 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
11e30 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nit);.}.#endif /
11e40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
11e50 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
11e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11e70 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11e80 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
11e90 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
11ea0 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
11eb0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
11ec0 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
11ed0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
11ee0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
11ef0 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
11f00 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
11f10 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
11f20 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
11f30 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
11f40 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
11f50 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
11f60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11f70 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
11f80 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
11f90 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65  pParse, .  Where
11fa0 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73  Clause *pWC,.  s
11fb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
11fc0 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  em *pSrc,.  Expr
11fd0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29  List *pOrderBy.)
11fe0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
11ff0 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
12000 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12010 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
12020 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
12030 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
12040 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
12050 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
12060 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
12070 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
12080 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
12090 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
120a0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69  nOrderBy;.  sqli
120b0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
120c0 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45  pIdxInfo;..  WHE
120d0 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70  RETRACE(("Recomp
120e0 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f  uting index info
120f0 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70   for %s...\n", p
12100 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
12110 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  ));..  /* Count 
12120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
12130 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
12140 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
12150 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
12160 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
12170 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
12180 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
12190 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
121a0 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
121b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
121c0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
121d0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
121e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
121f0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65  ssert( (pTerm->e
12200 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d  Operator&(pTerm-
12210 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d  >eOperator-1))==
12220 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
12230 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
12240 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
12250 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
12260 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
12270 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
12280 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
12290 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
122a0 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
122b0 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
122c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
122d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
122e0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
122f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
12300 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
12310 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
12320 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
12330 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
12340 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
12350 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12360 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
12370 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
12380 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
12390 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
123a0 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
123b0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
123c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
123d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
123e0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
123f0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
12400 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
12410 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
12420 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
12430 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
12440 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
12450 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
12460 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
12470 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pr;.    }.  }.. 
12480 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
12490 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
124a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
124b0 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
124c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
124d0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
124e0 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
124f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
12510 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
12520 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
12530 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
12560 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
12570 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
12580 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
12590 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
125a0 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
125b0 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
125c0 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20  /* (double)0 In 
125d0 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
125e0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
125f0 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  NT... */.    ret
12600 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
12610 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12620 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
12630 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12640 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
12650 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
12660 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
12670 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
12680 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
12690 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
126a0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
126b0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
126c0 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
126d0 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
126e0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
126f0 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
12700 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
12710 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12720 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
12730 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
12740 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
12750 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12760 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
12770 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
12780 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
12790 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
127a0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
127b0 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
127c0 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
127d0 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
127e0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
127f0 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
12800 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
12810 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
12820 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
12830 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
12840 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
12850 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
12860 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
12870 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
12880 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
12890 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
128a0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
128b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
128c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
128d0 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
128e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
128f0 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
12940 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
12950 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
12960 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
12970 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12980 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
12990 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
129a0 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
129b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
129c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
129d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
129e0 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  1))==0 );.    te
129f0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
12a00 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
12a10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
12a20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12a30 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  r==WO_ISNULL );.
12a40 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
12a50 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
12a60 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63  N|WO_ISNULL) ) c
12a70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
12a80 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
12a90 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12aa0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
12ab0 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
12ac0 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64  set = i;.    pId
12ad0 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75  xCons[j].op = (u
12ae0 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
12af0 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  or;.    /* The d
12b00 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
12b10 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
12b20 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
12b30 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
12b40 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
12b50 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
12b60 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
12b70 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
12b80 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
12b90 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
12ba0 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
12bb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
12bc0 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
12bd0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
12be0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12bf0 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
12c00 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
12c10 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
12c20 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
12c30 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12c40 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
12c50 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
12c60 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12c70 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
12c80 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
12c90 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12ca0 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
12cb0 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
12cc0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12cd0 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
12ce0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
12cf0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
12d00 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
12d10 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
12d20 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
12d30 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
12d40 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
12d50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
12d60 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
12d70 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12d80 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
12d90 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
12da0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
12db0 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
12dc0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12dd0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
12de0 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
12df0 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
12e00 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
12e10 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
12e20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12e30 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
12e40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
12e50 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
12e60 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
12e70 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
12e80 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
12e90 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
12ea0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
12eb0 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
12ec0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69  3_index_info poi
12ed0 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  nter passed.** a
12ee0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  s the argument..
12ef0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12f00 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
12f10 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
12f20 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
12f30 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
12f40 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
12f50 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
12f60 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
12f70 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
12f80 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
12f90 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12fa0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
12fb0 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
12fc0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
12fd0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
12fe0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
12ff0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
13000 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
13010 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
13020 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
13030 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
13040 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
13050 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
13060 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
13070 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
13080 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
13090 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
130a0 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
130b0 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
130c0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
130d0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
130e0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
130f0 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
13100 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
13110 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  c;..  WHERETRACE
13120 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f  (("xBestIndex fo
13130 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  r %s\n", pTab->z
13140 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f  Name));.  TRACE_
13150 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
13160 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
13170 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
13180 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
13190 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
131a0 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
131b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
131c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
131d0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
131e0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
131f0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
13200 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
13210 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
13220 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13230 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
13240 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
13250 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
13260 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13270 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
13280 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
13290 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
132a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
132b0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
132c0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
132d0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
132e0 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
132f0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
13300 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
13310 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
13320 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13330 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
13340 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13350 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13360 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
13370 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
13380 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
13390 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
133a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
133b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
133c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
133d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
133e0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
133f0 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
13400 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65  le..**.** The be
13410 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70  st index is comp
13420 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73  uted by the xBes
13430 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66  tIndex method of
13440 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
13450 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54  table module.  T
13460 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
13470 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61  eally just a wra
13480 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75  pper that sets u
13490 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  p.** the sqlite3
134a0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
134b0 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73  cture that is us
134c0 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74  ed to communicat
134d0 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49  e with.** xBestI
134e0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ndex..**.** In a
134f0 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74   join, this rout
13500 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c  ine might be cal
13510 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  led multiple tim
13520 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61  es for the.** sa
13530 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  me virtual table
13540 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
13550 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13560 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ure is created.*
13570 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
13580 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
13590 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65  nvocation and re
135a0 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73  used on all subs
135b0 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61  equent.** invoca
135c0 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69  tions.  The sqli
135d0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
135e0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
135f0 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f   used when.** co
13600 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
13610 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69  to access the vi
13620 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
13630 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74  e whereInfoDelet
13640 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  e() .** routine 
13650 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72  takes care of fr
13660 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  eeing the sqlite
13670 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13680 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20  ucture after.** 
13690 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69  everybody has fi
136a0 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a  nished with it..
136b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
136c0 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
136d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
136e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
136f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
13700 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
13710 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13730 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
13740 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
13750 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13760 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c,      /* The F
13770 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
13780 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
13790 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137b0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
137c0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
137d0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  for index */.  B
137e0 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c  itmask notValid,
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13800 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 76 61  * Cursors not va
13810 6c 69 64 20 66 6f 72 20 61 6e 79 20 70 75 72 70  lid for any purp
13820 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ose */.  ExprLis
13830 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
13840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13850 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
13860 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
13870 70 43 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20  pCost,          
13880 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
13890 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
138a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
138b0 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
138c0 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66  fo  /* Index inf
138d0 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
138e0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  to xBestIndex */
138f0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
13900 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
13910 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
13920 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
13930 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
13940 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
13950 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
13960 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13970 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
13980 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
13990 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
139a0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
139b0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
139c0 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20  double rCost;.. 
139d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73   /* Make sure ws
139e0 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c  Flags is initial
139f0 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e  ized to some san
13a00 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69  e value. Otherwi
13a10 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a  se, if the .  **
13a20 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63   malloc in alloc
13a30 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66  ateIndexInfo() f
13a40 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75  ails and this fu
13a50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c  nction returns l
13a60 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c  eaving.  ** wsFl
13a70 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74  ags in an uninit
13a80 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74  ialized state, t
13a90 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65  he caller may be
13aa0 68 61 76 65 20 75 6e 70 72 65 64 69 63 74 61 62  have unpredictab
13ab0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ly..  */.  memse
13ac0 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
13ad0 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
13ae0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
13af0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
13b00 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49  ALTABLE;..  /* I
13b10 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
13b20 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
13b30 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
13b40 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20  previously.  ** 
13b50 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e  allocated and in
13b60 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
13b70 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  allocate and ini
13b80 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a  tialize it now..
13b90 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
13ba0 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20  = *ppIdxInfo;.  
13bb0 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
13bc0 29 7b 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66  ){.    *ppIdxInf
13bd0 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  o = pIdxInfo = a
13be0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
13bf0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
13c00 72 63 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  rc, pOrderBy);. 
13c10 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66   }.  if( pIdxInf
13c20 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
13c30 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  rn;.  }..  /* At
13c40 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
13c50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13c60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
13c70 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e  at pIdxInfo poin
13c80 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20  ts.  ** to will 
13c90 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61  have been initia
13ca0 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75  lized, either du
13cb0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
13cc0 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20   invocation or. 
13cd0 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20   ** during some 
13ce0 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e  prior invocation
13cf0 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68  .  Now we just h
13d00 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65  ave to customize
13d10 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c   the.  ** detail
13d20 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f  s of pIdxInfo fo
13d30 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  r the current in
13d40 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73  vocation and pas
13d50 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65  s it to.  ** xBe
13d60 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20  stIndex..  */.. 
13d70 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e   /* The module n
13d80 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  ame must be defi
13d90 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68  ned. Also, by th
13da0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
13db0 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f  ust.  ** be a po
13dc0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
13dd0 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
13de0 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  re. Otherwise.  
13df0 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  ** sqlite3ViewGe
13e00 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77  tColumnNames() w
13e10 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64  ould have picked
13e20 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a   up the error. .
13e30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13e40 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
13e50 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75   && pTab->azModu
13e60 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73  leArg[0] );.  as
13e70 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74  sert( sqlite3Get
13e80 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
13e90 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f  b, pTab) );..  /
13ea0 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74  * Set the aConst
13eb0 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66  raint[].usable f
13ec0 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61  ields and initia
13ed0 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f  lize all .  ** o
13ee0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
13ef0 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
13f00 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
13f10 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
13f20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
13f30 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
13f40 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63  hand.  ** side c
13f50 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
13f60 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
13f70 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
13f80 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
13f90 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  * table.  In oth
13fa0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
13fb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
13fc0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
13fd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
13fe0 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20  column = expr.  
13ff0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  **.  ** and we a
14000 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20  re evaluating a 
14010 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  join, then the c
14020 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
14030 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c  umn is .  ** onl
14040 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
14050 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
14060 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
14070 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
14080 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
14090 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
140a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43    **.  ** The aC
140b0 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72  onstraints[] arr
140c0 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ay contains entr
140d0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ies for all cons
140e0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
140f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
14100 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20  e.  That way we 
14110 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d  only have to com
14120 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a  pute it once.  *
14130 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * even though we
14140 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69   might try to pi
14150 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ck the best inde
14160 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  x multiple times
14170 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  ..  ** For each 
14180 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69  attempt at picki
14190 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  ng an index, the
141a0 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
141b0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69   in the.  ** joi
141c0 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  n might be diffe
141d0 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20  rent so we have 
141e0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
141f0 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a   usable flag.  *
14200 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a  * each time..  *
14210 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
14220 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
14230 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14240 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
14250 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73  onstraint;.  pUs
14260 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
14270 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14280 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14290 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
142a0 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
142b0 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20  ons++){.    j = 
142c0 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
142d0 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d  ffset;.    pTerm
142e0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
142f0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
14300 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ble = (pTerm->pr
14310 65 72 65 71 52 69 67 68 74 26 6e 6f 74 52 65 61  ereqRight&notRea
14320 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d  dy) ? 0 : 1;.  }
14330 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
14340 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
14350 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
14360 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
14370 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
14380 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
14390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
143a0 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
143b0 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
143c0 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
143d0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
143e0 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
143f0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
14400 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
14410 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
14420 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
14430 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
14440 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
14450 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14460 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64  OINT... */.  pId
14470 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
14480 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
14490 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
144a0 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  )2);.  nOrderBy 
144b0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
144c0 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70 4f 72  erBy;.  if( !pOr
144d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64  derBy ){.    pId
144e0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
144f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
14500 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
14510 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
14520 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  Info) ){.    ret
14530 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78  urn;.  }..  pIdx
14540 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
14550 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
14560 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
14570 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
14580 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
14590 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
145a0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
145b0 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61   if( pUsage[i].a
145c0 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
145d0 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20      pCost->used 
145e0 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f  |= pWC->a[pIdxCo
145f0 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[i].iTermOffse
14600 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  t].prereqRight;.
14610 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14620 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
14630 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
14640 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65 64  and the selected
14650 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
14660 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  ndex.  ** does n
14670 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c 20 69  ot satisfy it, i
14680 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f 73 74  ncrease the cost
14690 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63 63   of the scan acc
146a0 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20  ordingly. This. 
146b0 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20   ** matches the 
146c0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e  processing for n
146d0 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65  on-virtual table
146e0 73 20 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e  s in bestBtreeIn
146f0 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43  dex()..  */.  rC
14700 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ost = pIdxInfo->
14710 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20  estimatedCost;. 
14720 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
14730 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
14740 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b  ByConsumed==0 ){
14750 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73  .    rCost += es
14760 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73  tLog(rCost)*rCos
14770 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  t;.  }..  /* The
14780 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c   cost is not all
14790 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  owed to be large
147a0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49  r than SQLITE_BI
147b0 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20  G_DBL (the.  ** 
147c0 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
147d0 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
147e0 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
147f0 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  s, then the.  **
14800 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73   (cost<lowestCos
14810 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69  t) test below wi
14820 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
14830 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65  ..  ** .  ** Use
14840 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73   "(double)2" ins
14850 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e  tead of "2.0" in
14860 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54   case OMIT_FLOAT
14870 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20  ING_POINT .  ** 
14880 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f  is defined..  */
14890 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42  .  if( (SQLITE_B
148a0 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29  IG_DBL/((double)
148b0 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20  2))<rCost ){.   
148c0 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
148d0 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
148e0 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20  ((double)2));.  
148f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73 74  }else{.    pCost
14900 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
14910 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  .  }.  pCost->pl
14920 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20  an.u.pVtabIdx = 
14930 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
14940 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
14950 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
14960 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
14970 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
14980 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f  DERBY;.  }.  pCo
14990 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30  st->plan.nEq = 0
149a0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  ;.  pIdxInfo->nO
149b0 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
149c0 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  y;..  /* Try to 
149d0 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69  find a more effi
149e0 63 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74  cient access pat
149f0 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75  tern by using mu
14a00 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20  ltiple indexes. 
14a10 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20   ** to optimize 
14a20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e  an OR expression
14a30 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
14a40 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a  E clause. .  */.
14a50 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e    bestOrClauseIn
14a60 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
14a70 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
14a80 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65   notValid, pOrde
14a90 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23  rBy, pCost);.}.#
14aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14ab0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14ac0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  E */../*.** Argu
14ad0 6d 65 6e 74 20 70 49 64 78 20 69 73 20 61 20 70  ment pIdx is a p
14ae0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 64  ointer to an ind
14af0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ex structure tha
14b00 74 20 68 61 73 20 61 6e 20 61 72 72 61 79 20 6f  t has an array o
14b10 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45  f.** SQLITE_INDE
14b20 58 5f 53 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79  X_SAMPLES evenly
14b30 20 73 70 61 63 65 64 20 73 61 6d 70 6c 65 73 20   spaced samples 
14b40 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 64  of the first ind
14b50 65 78 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73  exed column.** s
14b60 74 6f 72 65 64 20 69 6e 20 49 6e 64 65 78 2e 61  tored in Index.a
14b70 53 61 6d 70 6c 65 2e 20 54 68 65 73 65 20 73 61  Sample. These sa
14b80 6d 70 6c 65 73 20 64 69 76 69 64 65 20 74 68 65  mples divide the
14b90 20 64 6f 6d 61 69 6e 20 6f 66 20 76 61 6c 75 65   domain of value
14ba0 73 20 73 74 6f 72 65 64 0a 2a 2a 20 74 68 65 20  s stored.** the 
14bb0 69 6e 64 65 78 20 69 6e 74 6f 20 28 53 51 4c 49  index into (SQLI
14bc0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
14bd0 2b 31 29 20 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20  +1) regions..** 
14be0 52 65 67 69 6f 6e 20 30 20 63 6f 6e 74 61 69 6e  Region 0 contain
14bf0 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 6c 65 73  s all values les
14c00 73 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  s than the first
14c10 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52   sample value. R
14c20 65 67 69 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61  egion.** 1 conta
14c30 69 6e 73 20 76 61 6c 75 65 73 20 62 65 74 77 65  ins values betwe
14c40 65 6e 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  en the first and
14c50 20 73 65 63 6f 6e 64 20 73 61 6d 70 6c 65 73 2e   second samples.
14c60 20 20 52 65 67 69 6f 6e 20 32 20 63 6f 6e 74 61    Region 2 conta
14c70 69 6e 73 0a 2a 2a 20 76 61 6c 75 65 73 20 62 65  ins.** values be
14c80 74 77 65 65 6e 20 73 61 6d 70 6c 65 73 20 32 20  tween samples 2 
14c90 61 6e 64 20 33 2e 20 20 41 6e 64 20 73 6f 20 6f  and 3.  And so o
14ca0 6e 2e 20 20 52 65 67 69 6f 6e 20 53 51 4c 49 54  n.  Region SQLIT
14cb0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 0a  E_INDEX_SAMPLES.
14cc0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75  ** contains valu
14cd0 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  es larger than t
14ce0 68 65 20 6c 61 73 74 20 73 61 6d 70 6c 65 2e 0a  he last sample..
14cf0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
14d00 65 78 20 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79  ex contains many
14d10 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 61   duplicates of a
14d20 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 2c 20 74   single value, t
14d30 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hen it is.** pos
14d40 73 69 62 6c 65 20 74 68 61 74 20 74 77 6f 20 6f  sible that two o
14d50 72 20 6d 6f 72 65 20 61 64 6a 61 63 65 6e 74 20  r more adjacent 
14d60 73 61 6d 70 6c 65 73 20 63 61 6e 20 68 6f 6c 64  samples can hold
14d70 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
14d80 0a 2a 2a 20 57 68 65 6e 20 74 68 61 74 20 69 73  .** When that is
14d90 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 20 73   the case, the s
14da0 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
14db0 20 72 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20   region code is 
14dc0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e  returned.** when
14dd0 20 72 6f 75 6e 64 55 70 20 69 73 20 66 61 6c 73   roundUp is fals
14de0 65 20 61 6e 64 20 74 68 65 20 6c 61 72 67 65 73  e and the larges
14df0 74 20 70 6f 73 73 69 62 6c 65 20 72 65 67 69 6f  t possible regio
14e00 6e 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  n code is return
14e10 65 64 0a 2a 2a 20 77 68 65 6e 20 72 6f 75 6e 64  ed.** when round
14e20 55 70 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  Up is true..**.*
14e30 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
14e40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
14e50 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
14e60 6f 66 20 74 68 65 20 72 65 67 69 6f 6e 73 20 76  of the regions v
14e70 61 6c 75 65 20 0a 2a 2a 20 70 56 61 6c 20 6c 69  alue .** pVal li
14e80 65 73 20 69 6e 2c 20 73 65 74 73 20 2a 70 69 52  es in, sets *piR
14e90 65 67 69 6f 6e 20 74 6f 20 74 68 65 20 72 65 67  egion to the reg
14ea0 69 6f 6e 20 69 6e 64 65 78 20 28 61 20 76 61 6c  ion index (a val
14eb0 75 65 20 62 65 74 77 65 65 6e 20 30 0a 2a 2a 20  ue between 0.** 
14ec0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
14ed0 5f 53 41 4d 50 4c 45 53 2b 31 2c 20 69 6e 63 6c  _SAMPLES+1, incl
14ee0 75 73 69 76 65 29 20 61 6e 64 20 72 65 74 75 72  usive) and retur
14ef0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
14f00 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f   Or, if an OOM o
14f10 63 63 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76  ccurs while conv
14f20 65 72 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75  erting text valu
14f30 65 73 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64  es between encod
14f40 69 6e 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ings,.** SQLITE_
14f50 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
14f60 64 20 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20  d and *piRegion 
14f70 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
14f80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14f90 4e 41 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74  NABLE_STAT2.stat
14fa0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
14fb0 65 52 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65  eRegion(.  Parse
14fc0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14fd0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
14fe0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14ff0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15010 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
15020 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
15030 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15040 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f   *pVal,        /
15050 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69  * Value to consi
15060 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
15070 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
15080 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6c       /* Return l
15090 61 72 67 65 73 74 20 76 61 6c 69 64 20 72 65 67  argest valid reg
150a0 69 6f 6e 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ion if true */. 
150b0 20 69 6e 74 20 2a 70 69 52 65 67 69 6f 6e 20 20   int *piRegion  
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150d0 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64  OUT: Region of d
150e0 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76  omain in which v
150f0 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a  alue lies */.){.
15100 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55    assert( roundU
15110 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d  p==0 || roundUp=
15120 3d 31 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =1 );.  if( ALWA
15130 59 53 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20  YS(pVal) ){.    
15140 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
15150 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
15160 6d 70 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69 20  mple;.    int i 
15170 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 65 54 79  = 0;.    int eTy
15180 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
15190 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
151a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
151b0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c  QLITE_INTEGER ||
151c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
151d0 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 64 6f  LOAT ){.      do
151e0 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
151f0 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56  _value_double(pV
15200 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  al);.      for(i
15210 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44  =0; i<SQLITE_IND
15220 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29  EX_SAMPLES; i++)
15230 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
15240 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
15250 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
15260 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15270 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
15280 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
15290 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
152a0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
152b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
152c0 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72  aSample[i].u.r>r
152d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
152e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
152f0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
15300 5d 2e 75 2e 72 3e 3d 72 20 29 20 62 72 65 61 6b  ].u.r>=r ) break
15310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15320 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
15330 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15340 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 69 20  NULL ){.      i 
15350 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
15360 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
15370 20 20 77 68 69 6c 65 28 20 69 3c 53 51 4c 49 54    while( i<SQLIT
15380 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
15390 26 26 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  && aSample[i].eT
153a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
153b0 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
153c0 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
153d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
153e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
153f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
15400 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
15410 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   *z;.      int n
15420 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 56 61 6c  ;..      /* pVal
15430 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c 69   comes from sqli
15440 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
15450 28 29 20 73 6f 20 74 68 65 20 74 79 70 65 20 63  () so the type c
15460 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
15470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
15480 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
15490 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  T || eType==SQLI
154a0 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a 20 20 20 20  TE_BLOB );..    
154b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
154c0 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
154d0 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
154e0 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
154f0 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
15500 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
15510 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
15530 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
15540 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
15550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
15560 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
15570 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
15580 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78  E_UTF8, 0, *pIdx
15590 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
155a0 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
155b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
155c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
155d0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
155e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
155f0 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
15620 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
15630 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15650 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20    z = (const u8 
15660 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  *)sqlite3ValueTe
15670 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e  xt(pVal, pColl->
15680 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  enc);.        if
15690 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !z ){.        
156a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
156b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
156c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
156d0 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70   z && pColl && p
156e0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20  Coll->xCmp );.  
156f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20      }.      n = 
15700 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
15710 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  s(pVal, pColl->e
15720 6e 63 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  nc);..      for(
15730 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e  i=0; i<SQLITE_IN
15740 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b  DEX_SAMPLES; i++
15750 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
15760 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
15770 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
15780 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
15790 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
157a0 65 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  etype==SQLITE_NU
157b0 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70  LL || eSampletyp
157c0 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e  e<eType ) contin
157d0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
157e0 28 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54  (eSampletype!=eT
157f0 79 70 65 29 20 29 20 62 72 65 61 6b 3b 0a 23 69  ype) ) break;.#i
15800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15810 54 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20  T_UTF16.        
15820 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d  if( pColl->enc!=
15830 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
15840 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61           int nSa
15850 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mple;.          
15860 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20  char *zSample = 
15870 73 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28  sqlite3Utf8to16(
15880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
15890 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61  b, pColl->enc, a
158a0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61  Sample[i].u.z, a
158b0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c  Sample[i].nByte,
158c0 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20   &nSample.      
158d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
158e0 20 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b   if( !zSample ){
158f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
15900 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
15910 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
15920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15930 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15950 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
15960 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53  pColl->pUser, nS
15970 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20  ample, zSample, 
15980 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  n, z);.         
15990 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
159a0 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20  b, zSample);.   
159b0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
159c0 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
159d0 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d        c = pColl-
159e0 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
159f0 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  er, aSample[i].n
15a00 42 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  Byte, aSample[i]
15a10 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  .u.z, n, z);.   
15a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15a30 66 28 20 63 2d 72 6f 75 6e 64 55 70 3e 3d 30 20  f( c-roundUp>=0 
15a40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
15a50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
15a60 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 53  rt( i>=0 && i<=S
15a70 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
15a80 4c 45 53 20 29 3b 0a 20 20 20 20 2a 70 69 52 65  LES );.    *piRe
15a90 67 69 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  gion = i;.  }.  
15aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ab0 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  ;.}.#endif   /* 
15ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15ad0 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f  ABLE_STAT2 */../
15ae0 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
15af0 6f 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65  on pExpr represe
15b00 6e 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61  nts a literal va
15b10 6c 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  lue, set *pp to 
15b20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73  point to.** an s
15b30 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
15b40 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
15b50 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
15b60 2c 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a  , with affinity.
15b70 2a 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ** aff applied t
15b80 6f 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74  o it, before ret
15b90 75 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68  urning. It is th
15ba0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15bb0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   of the .** call
15bc0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
15bd0 20 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74   release this st
15be0 72 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69  ructure by passi
15bf0 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c  ng it to .** sql
15c00 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
15c10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
15c20 72 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61  rrent parse is a
15c30 20 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69   recompile (sqli
15c40 74 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20  te3Reprepare()) 
15c50 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20  and pExpr.** is 
15c60 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  an SQL variable 
15c70 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
15c80 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  as a non-NULL va
15c90 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c  lue bound to it,
15ca0 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71  .** create an sq
15cb0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
15cc0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
15cd0 20 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61   this value, aga
15ce0 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e  in with.** affin
15cf0 69 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20  ity aff applied 
15d00 74 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a  to it, instead..
15d10 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
15d20 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70   of the above ap
15d30 70 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ply, set *pp to 
15d40 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
15d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15d60 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
15d70 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
15d80 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23   SQLITE_OK..*/.#
15d90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15da0 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63  BLE_STAT2.static
15db0 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78   int valueFromEx
15dc0 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
15dd0 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  rse, .  Expr *pE
15de0 78 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20  xpr, .  u8 aff, 
15df0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15e00 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70   **pp.){.  if( p
15e10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
15e20 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78  IABLE.   || (pEx
15e30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
15e40 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
15e50 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a  2==TK_VARIABLE).
15e60 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61    ){.    int iVa
15e70 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  r = pExpr->iColu
15e80 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
15e90 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
15ea0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
15eb0 72 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33  r); /* IMP: R-23
15ec0 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20  257-02778 */.   
15ed0 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64   *pp = sqlite3Vd
15ee0 62 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73  beGetValue(pPars
15ef0 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
15f00 56 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72  Var, aff);.    r
15f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
15f30 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
15f40 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
15f50 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
15f60 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23  8, aff, pp);.}.#
15f70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
15f80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
15f90 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
15fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
15fb0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
15fc0 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
15fd0 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
15fe0 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
15ff0 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
16000 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
16010 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
16020 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
16030 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
16040 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
16050 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
16060 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
16070 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
16080 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
16090 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
160a0 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
160b0 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
160c0 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
160d0 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
160e0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
160f0 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
16100 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
16110 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
16120 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
16150 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
16160 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
16170 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
16180 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
16190 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
161a0 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
161b0 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
161c0 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
161d0 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
161e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
161f0 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
16200 20 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69   nEq parameter i
16210 73 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64  s passed the ind
16220 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ex of the index 
16230 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74  column subject t
16240 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63  o the.** range c
16250 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
16260 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
16270 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
16280 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
16290 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ** optimized by 
162a0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
162b0 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
162c0 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  mple, assuming i
162d0 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20  ndex p is.** on 
162e0 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
162f0 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
16300 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
16310 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
16320 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
16330 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
16340 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
16350 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
16360 65 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  e 1 (as the rang
16370 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
16380 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68  umn,.** b, is th
16390 65 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f  e second left-mo
163a0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
163b0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
163c0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
163d0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
163e0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
163f0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
16400 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
16410 64 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a  d be passed 0..*
16420 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
16430 64 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  d value is an in
16440 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
16450 61 6e 64 20 31 30 30 2c 20 69 6e 63 6c 75 73 69  and 100, inclusi
16460 76 65 2e 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20  ve. A return.** 
16470 76 61 6c 75 65 20 6f 66 20 31 20 69 6e 64 69 63  value of 1 indic
16480 61 74 65 73 20 74 68 61 74 20 74 68 65 20 70 72  ates that the pr
16490 6f 70 6f 73 65 64 20 72 61 6e 67 65 20 73 63 61  oposed range sca
164a0 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  n is expected to
164b0 20 76 69 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78   visit.** approx
164c0 69 6d 61 74 65 6c 79 20 31 2f 31 30 30 74 68 20  imately 1/100th 
164d0 28 31 25 29 20 6f 66 20 74 68 65 20 72 6f 77 73  (1%) of the rows
164e0 20 73 65 6c 65 63 74 65 64 20 62 79 20 74 68 65   selected by the
164f0 20 6e 45 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a   nEq equality.**
16500 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 69 66   constraints (if
16510 20 61 6e 79 29 2e 20 41 20 72 65 74 75 72 6e 20   any). A return 
16520 76 61 6c 75 65 20 6f 66 20 31 30 30 20 69 6e 64  value of 100 ind
16530 69 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69  icates that it i
16540 73 20 65 78 70 65 63 74 65 64 0a 2a 2a 20 74 68  s expected.** th
16550 61 74 20 74 68 65 20 72 61 6e 67 65 20 73 63 61  at the range sca
16560 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 65 76 65  n will visit eve
16570 72 79 20 72 6f 77 20 28 31 30 30 25 29 20 73 65  ry row (100%) se
16580 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 65 71  lected by the eq
16590 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72  uality.** constr
165a0 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aints..**.** In 
165b0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
165c0 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c  qlite_stat2 ANAL
165d0 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
165e0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
165f0 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
16600 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 33  earch space by 3
16610 2f 34 74 68 73 2e 20 20 48 65 6e 63 65 20 61 20  /4ths.  Hence a 
16620 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
16630 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c  t (x>?).** resul
16640 74 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ts in a return o
16650 66 20 32 35 20 61 6e 64 20 61 20 72 61 6e 67 65  f 25 and a range
16660 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f   constraint (x>?
16670 20 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74   AND x<?) result
16680 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e  s.** in a return
16690 20 6f 66 20 36 2e 0a 2a 2f 0a 73 74 61 74 69 63   of 6..*/.static
166a0 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
166b0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
166c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
166d0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
166e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
166f0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
16700 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16710 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   The index conta
16720 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d  ining the range-
16730 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b  compared column;
16740 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45   "x" */.  int nE
16750 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
16760 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e  * index into p->
16770 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61  aCol[] of the ra
16780 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c  nge-compared col
16790 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  umn */.  WhereTe
167a0 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
167b0 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
167c0 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
167d0 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
167e0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
167f0 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
16800 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
16810 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
16820 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
16830 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a   NULL */.  int *
16840 70 69 45 73 74 20 20 20 20 20 20 20 20 20 20 20  piEst           
16850 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 76  /* OUT: Return v
16860 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  alue */.){.  int
16870 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16880 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16890 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20  ENABLE_STAT2..  
168a0 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d  if( nEq==0 && p-
168b0 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >aSample ){.    
168c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
168d0 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20  LowerVal = 0;.  
168e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
168f0 2a 70 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a  *pUpperVal = 0;.
16900 20 20 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20      int iEst;.  
16910 20 20 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30    int iLower = 0
16920 3b 0a 20 20 20 20 69 6e 74 20 69 55 70 70 65 72  ;.    int iUpper
16930 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   = SQLITE_INDEX_
16940 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 69 6e 74  SAMPLES;.    int
16950 20 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20   roundUpUpper = 
16960 30 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e 64  0;.    int round
16970 55 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20  UpLower = 0;.   
16980 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
16990 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
169a0 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
169b0 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
169c0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
169d0 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
169e0 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
169f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
16a00 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
16a10 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
16a20 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20  pLowerVal);.    
16a30 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
16a40 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
16a50 47 54 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f  GT || pLower->eO
16a60 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29  perator==WO_GE )
16a70 3b 0a 20 20 20 20 20 20 72 6f 75 6e 64 55 70 4c  ;.      roundUpL
16a80 6f 77 65 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e  ower = (pLower->
16a90 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54  eOperator==WO_GT
16aa0 29 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  ) ?1:0;.    }.  
16ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16ac0 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b  _OK && pUpper ){
16ad0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
16ae0 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
16af0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
16b00 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
16b10 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
16b20 70 72 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72  pr, aff, &pUpper
16b30 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
16b40 72 74 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65  rt( pUpper->eOpe
16b50 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20  rator==WO_LT || 
16b60 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
16b70 72 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20  r==WO_LE );.    
16b80 20 20 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d    roundUpUpper =
16b90 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
16ba0 74 6f 72 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30  tor==WO_LE) ?1:0
16bb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
16bd0 7c 20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20  | (pLowerVal==0 
16be0 26 26 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 29  && pUpperVal==0)
16bf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16c00 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65  3ValueFree(pLowe
16c10 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  rVal);.      sql
16c20 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55  ite3ValueFree(pU
16c30 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  pperVal);.      
16c40 67 6f 74 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66  goto range_est_f
16c50 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c  allback;.    }el
16c60 73 65 20 69 66 28 20 70 4c 6f 77 65 72 56 61 6c  se if( pLowerVal
16c70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
16c80 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
16c90 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55  on(pParse, p, pU
16ca0 70 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70  pperVal, roundUp
16cb0 55 70 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b  Upper, &iUpper);
16cc0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65  .      if( pLowe
16cd0 72 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70  r ) iLower = iUp
16ce0 70 65 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65  per/2;.    }else
16cf0 20 69 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d   if( pUpperVal==
16d00 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
16d10 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
16d20 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77  (pParse, p, pLow
16d30 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f  erVal, roundUpLo
16d40 77 65 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20  wer, &iLower);. 
16d50 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
16d60 29 20 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77  ) iUpper = (iLow
16d70 65 72 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45  er + SQLITE_INDE
16d80 58 5f 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32  X_SAMPLES + 1)/2
16d90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16da0 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
16db0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
16dc0 20 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72   p, pUpperVal, r
16dd0 6f 75 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55  oundUpUpper, &iU
16de0 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pper);.      if(
16df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
16e10 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
16e20 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65  pParse, p, pLowe
16e30 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77  rVal, roundUpLow
16e40 65 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20  er, &iLower);.  
16e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16e60 57 48 45 52 45 54 52 41 43 45 28 28 22 72 61 6e  WHERETRACE(("ran
16e70 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a  ge scan regions:
16e80 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77   %d..%d\n", iLow
16e90 65 72 2c 20 69 55 70 70 65 72 29 29 3b 0a 0a 20  er, iUpper));.. 
16ea0 20 20 20 69 45 73 74 20 3d 20 69 55 70 70 65 72     iEst = iUpper
16eb0 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74   - iLower;.    t
16ec0 65 73 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53  estcase( iEst==S
16ed0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16ee0 4c 45 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LES );.    asser
16ef0 74 28 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f  t( iEst<=SQLITE_
16f00 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b  INDEX_SAMPLES );
16f10 0a 20 20 20 20 69 66 28 20 69 45 73 74 3c 31 20  .    if( iEst<1 
16f20 29 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20  ){.      *piEst 
16f30 3d 20 35 30 2f 53 51 4c 49 54 45 5f 49 4e 44 45  = 50/SQLITE_INDE
16f40 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d  X_SAMPLES;.    }
16f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 45  else{.      *piE
16f60 73 74 20 3d 20 28 69 45 73 74 2a 31 30 30 29 2f  st = (iEst*100)/
16f70 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
16f80 50 4c 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PLES;.    }.    
16f90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
16fa0 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20  (pLowerVal);.   
16fb0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16fc0 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20  e(pUpperVal);.  
16fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16fe0 0a 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62  .range_est_fallb
16ff0 61 63 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ack:.#else.  UNU
17000 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
17010 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
17020 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
17030 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17040 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (nEq);.#endif.  
17050 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
17060 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70  | pUpper );.  *p
17070 69 45 73 74 20 3d 20 31 30 30 3b 0a 20 20 69 66  iEst = 100;.  if
17080 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
17090 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
170a0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20  ERM_VNULL)==0 ) 
170b0 2a 70 69 45 73 74 20 2f 3d 20 34 3b 0a 20 20 69  *piEst /= 4;.  i
170c0 66 28 20 70 55 70 70 65 72 20 29 20 2a 70 69 45  f( pUpper ) *piE
170d0 73 74 20 2f 3d 20 34 3b 0a 20 20 72 65 74 75 72  st /= 4;.  retur
170e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
170f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17100 41 54 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT2./*.** Estima
17110 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
17120 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
17130 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
17140 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
17150 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
17160 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
17170 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
17180 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
17190 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
171a0 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
171b0 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
171c0 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
171d0 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
171e0 73 71 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73  sqlite_stat2 his
171f0 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
17200 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
17210 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
17220 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
17230 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
17240 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
17250 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
17260 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
17270 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
17280 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
17290 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
172a0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
172b0 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
172c0 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
172d0 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
172e0 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
172f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
17300 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
17310 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
17320 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
17330 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
17340 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17350 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
17360 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
17370 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
17380 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
17390 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
173a0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
173b0 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
173c0 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
173d0 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
173e0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
173f0 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 77 68 65  ture..*/.int whe
17400 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
17410 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17420 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17430 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
17440 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17450 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
17460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
17470 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f  ex whose left-mo
17480 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65  st column is pTe
17490 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  rm */.  Expr *pE
174a0 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
174b0 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
174c0 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
174d0 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
174e0 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f  /.  double *pnRo
174f0 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  w        /* Writ
17500 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
17510 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
17520 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
17530 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b  value *pRhs = 0;
17540 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69    /* VALUE on ri
17550 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
17560 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   pTerm */.  int 
17570 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20  iLower, iUpper; 
17580 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f        /* Range o
17590 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69  f histogram regi
175a0 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ons containing p
175b0 52 68 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  Rhs */.  u8 aff;
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
175e0 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
175f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17600 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
17610 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
17620 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
17630 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
17640 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
17650 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17660 72 6f 77 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rows */..  asser
17670 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
17680 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
17690 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
176a0 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
176b0 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
176c0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
176d0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
176e0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
176f0 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
17700 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
17710 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
17720 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
17730 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
17740 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
17750 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
17760 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
17770 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
17780 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e  .  rc = whereRan
17790 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
177a0 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 26 69 4c   p, pRhs, 0, &iL
177b0 6f 77 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ower);.  if( rc 
177c0 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
177d0 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
177e0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e  .  rc = whereRan
177f0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
17800 20 70 2c 20 70 52 68 73 2c 20 31 2c 20 26 69 55   p, pRhs, 1, &iU
17810 70 70 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pper);.  if( rc 
17820 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
17830 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
17840 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
17850 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
17860 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c 6e 22  gions: %d..%d\n"
17870 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  , iLower, iUpper
17880 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77 65 72  ));.  if( iLower
17890 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
178a0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
178b0 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49 54 45  owEst[0]/(SQLITE
178c0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32  _INDEX_SAMPLES*2
178d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  );.    if( nRowE
178e0 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70 6e 52  st<*pnRow ) *pnR
178f0 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
17900 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f 77 45  }else{.    nRowE
17910 73 74 20 3d 20 28 69 55 70 70 65 72 2d 69 4c 6f  st = (iUpper-iLo
17920 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74  wer)*p->aiRowEst
17930 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58  [0]/SQLITE_INDEX
17940 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 2a 70  _SAMPLES;.    *p
17950 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
17960 20 20 7d 0a 0a 77 68 65 72 65 45 71 75 61 6c 53    }..whereEqualS
17970 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
17980 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
17990 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
179a0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
179b0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
179c0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a  _ENABLE_STAT2) *
179d0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
179e0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a  _ENABLE_STAT2./*
179f0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
17a00 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17a10 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17a20 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
17a30 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
17a40 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
17a50 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
17a60 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
17a70 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
17a80 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
17a90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
17aa0 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
17ab0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
17ac0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
17ad0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
17ae0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
17af0 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
17b00 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
17b10 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
17b20 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
17b30 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
17b40 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
17b50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17b60 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
17b70 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
17b80 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
17b90 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
17ba0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
17bb0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
17bc0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
17bd0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
17be0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
17bf0 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
17c00 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
17c10 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
17c20 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
17c30 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
17c40 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
17c50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17c60 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17c70 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17c80 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17c90 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
17ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
17cb0 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d  dex whose left-m
17cc0 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54  ost column is pT
17cd0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  erm */.  ExprLis
17ce0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
17cf0 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20   The value list 
17d00 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78  on the RHS of "x
17d10 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e   IN (v1,v2,v3,..
17d20 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  .)" */.  double 
17d30 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a  *pnRow        /*
17d40 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
17d50 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
17d60 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
17d70 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
17d80 20 3d 20 30 3b 20 20 2f 2a 20 4f 6e 65 20 76 61   = 0;  /* One va
17d90 6c 75 65 20 66 72 6f 6d 20 6c 69 73 74 20 2a 2f  lue from list */
17da0 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72 2c 20 69  .  int iLower, i
17db0 55 70 70 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  Upper;       /* 
17dc0 52 61 6e 67 65 20 6f 66 20 68 69 73 74 6f 67 72  Range of histogr
17dd0 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f 6e 74 61  am regions conta
17de0 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f 0a 20 20  ining pRhs */.  
17df0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
17e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17e10 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
17e20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17e30 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 53  E_OK;       /* S
17e40 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
17e50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62  n code */.  doub
17e60 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  le nRowEst;     
17e70 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74        /* New est
17e80 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
17e90 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
17ea0 20 69 6e 74 20 6e 53 70 61 6e 20 3d 20 30 3b 20   int nSpan = 0; 
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17ec0 6d 62 65 72 20 6f 66 20 68 69 73 74 6f 67 72 61  mber of histogra
17ed0 6d 20 72 65 67 69 6f 6e 73 20 73 70 61 6e 6e 65  m regions spanne
17ee0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 69 6e 67  d */.  int nSing
17ef0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
17f00 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65   /* Histogram re
17f10 67 69 6f 6e 73 20 68 69 74 20 62 79 20 61 20 73  gions hit by a s
17f20 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ingle value */. 
17f30 20 69 6e 74 20 6e 4e 6f 74 46 6f 75 6e 64 20 3d   int nNotFound =
17f40 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f   0;        /* Co
17f50 75 6e 74 20 6f 66 20 76 61 6c 75 65 73 20 74 68  unt of values th
17f60 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74  at are not const
17f70 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ants */.  int i;
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17fa0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
17fb0 2f 0a 20 20 75 38 20 61 53 70 61 6e 5b 53 51 4c  /.  u8 aSpan[SQL
17fc0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
17fd0 53 2b 31 5d 3b 20 20 20 20 2f 2a 20 48 69 73 74  S+1];    /* Hist
17fe0 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 74 68  ogram regions th
17ff0 61 74 20 61 72 65 20 73 70 61 6e 6e 65 64 20 2a  at are spanned *
18000 2f 0a 20 20 75 38 20 61 53 69 6e 67 6c 65 5b 53  /.  u8 aSingle[S
18010 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
18020 4c 45 53 2b 31 5d 3b 20 20 2f 2a 20 48 69 73 74  LES+1];  /* Hist
18030 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 68 69  ogram regions hi
18040 74 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  t once */..  ass
18050 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
18060 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d  =0 );.  aff = p-
18070 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
18080 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
18090 66 69 6e 69 74 79 3b 0a 20 20 6d 65 6d 73 65 74  finity;.  memset
180a0 28 61 53 70 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  (aSpan, 0, sizeo
180b0 66 28 61 53 70 61 6e 29 29 3b 0a 20 20 6d 65 6d  f(aSpan));.  mem
180c0 73 65 74 28 61 53 69 6e 67 6c 65 2c 20 30 2c 20  set(aSingle, 0, 
180d0 73 69 7a 65 6f 66 28 61 53 69 6e 67 6c 65 29 29  sizeof(aSingle))
180e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
180f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
18110 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
18120 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
18130 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c  mExpr(pParse, pL
18140 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
18150 20 61 66 66 2c 20 26 70 56 61 6c 29 3b 0a 20 20   aff, &pVal);.  
18160 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
18170 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 3d 3d  ;.    if( pVal==
18180 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c  0 || sqlite3_val
18190 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
181a0 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
181b0 20 20 20 20 6e 4e 6f 74 46 6f 75 6e 64 2b 2b 3b      nNotFound++;
181c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
181d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
181e0 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
181f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 56 61 6c  (pParse, p, pVal
18200 2c 20 30 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20  , 0, &iLower);. 
18210 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
18220 6b 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  k;.    rc = wher
18230 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61  eRangeRegion(pPa
18240 72 73 65 2c 20 70 2c 20 70 56 61 6c 2c 20 31 2c  rse, p, pVal, 1,
18250 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20 69   &iUpper);.    i
18260 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
18270 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
18280 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 61  Upper ){.      a
18290 53 69 6e 67 6c 65 5b 69 4c 6f 77 65 72 5d 20 3d  Single[iLower] =
182a0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
182b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4c 6f       assert( iLo
182c0 77 65 72 3e 3d 30 20 26 26 20 69 55 70 70 65 72  wer>=0 && iUpper
182d0 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  <=SQLITE_INDEX_S
182e0 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 20 20  AMPLES );.      
182f0 77 68 69 6c 65 28 20 69 4c 6f 77 65 72 3c 69 55  while( iLower<iU
18300 70 70 65 72 20 29 20 61 53 70 61 6e 5b 69 4c 6f  pper ) aSpan[iLo
18310 77 65 72 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20  wer++] = 1;.    
18320 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
18330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18340 20 66 6f 72 28 69 3d 6e 53 70 61 6e 3d 30 3b 20   for(i=nSpan=0; 
18350 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  i<=SQLITE_INDEX_
18360 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20  SAMPLES; i++){. 
18370 20 20 20 20 20 69 66 28 20 61 53 70 61 6e 5b 69       if( aSpan[i
18380 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 70  ] ){.        nSp
18390 61 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  an++;.      }els
183a0 65 20 69 66 28 20 61 53 69 6e 67 6c 65 5b 69 5d  e if( aSingle[i]
183b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53 69 6e   ){.        nSin
183c0 67 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  gle++;.      }. 
183d0 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 45 73 74     }.    nRowEst
183e0 20 3d 20 28 6e 53 70 61 6e 2a 32 2b 6e 53 69 6e   = (nSpan*2+nSin
183f0 67 6c 65 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74  gle)*p->aiRowEst
18400 5b 30 5d 2f 28 32 2a 53 51 4c 49 54 45 5f 49 4e  [0]/(2*SQLITE_IN
18410 44 45 58 5f 53 41 4d 50 4c 45 53 29 0a 20 20 20  DEX_SAMPLES).   
18420 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 6e 4e              + nN
18430 6f 74 46 6f 75 6e 64 2a 70 2d 3e 61 69 52 6f 77  otFound*p->aiRow
18440 45 73 74 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20  Est[1];.    if( 
18450 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69 52  nRowEst > p->aiR
18460 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77 45  owEst[0] ) nRowE
18470 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74  st = p->aiRowEst
18480 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  [0];.    *pnRow 
18490 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
184a0 48 45 52 45 54 52 41 43 45 28 28 22 49 4e 20 72  HERETRACE(("IN r
184b0 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 6e 53 70  ow estimate: nSp
184c0 61 6e 3d 25 64 2c 20 6e 53 69 6e 67 6c 65 3d 25  an=%d, nSingle=%
184d0 64 2c 20 6e 4e 6f 74 46 6f 75 6e 64 3d 25 64 2c  d, nNotFound=%d,
184e0 20 65 73 74 3d 25 67 5c 6e 22 2c 0a 20 20 20 20   est=%g\n",.    
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 70               nSp
18500 61 6e 2c 20 6e 53 69 6e 67 6c 65 2c 20 6e 4e 6f  an, nSingle, nNo
18510 74 46 6f 75 6e 64 2c 20 6e 52 6f 77 45 73 74 29  tFound, nRowEst)
18520 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18530 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
18540 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18550 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
18560 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
18570 53 54 41 54 32 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  STAT2) */.../*.*
18580 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74 20  * Find the best 
18590 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
185a0 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69  ccessing a parti
185b0 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72  cular table.  Wr
185c0 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20  ite the.** best 
185d0 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69  query plan and i
185e0 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65  ts cost into the
185f0 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63   WhereCost objec
18600 74 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  t supplied as th
18610 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65  e.** last parame
18620 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ter..**.** The l
18630 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20  owest cost plan 
18640 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
18650 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
18660 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
18670 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
18680 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72  I/O needed to pr
18690 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
186a0 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46  ted result..** F
186b0 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c  actors that infl
186c0 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75  uence cost inclu
186d0 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  de:.**.**    *  
186e0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  The estimated nu
186f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
18700 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  t will be retrie
18710 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20  ved.  (The.**   
18720 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65      fewer the be
18730 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  tter.).**.**    
18740 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
18750 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f  t sorting must o
18760 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ccur..**.**    *
18770 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
18780 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73   there must be s
18790 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20  eparate lookups 
187a0 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
187b0 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65  index and in the
187c0 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a   main table..**.
187d0 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  ** If there was 
187e0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
187f0 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64  ause (pSrc->pInd
18800 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20  ex) attached to 
18810 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  the table in.** 
18820 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
18830 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
18840 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69  ction only consi
18850 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67  ders plans using
18860 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69   the .** named i
18870 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68  ndex. If no such
18880 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20   plan is found, 
18890 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
188a0 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c  d cost is.** SQL
188b0 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20  ITE_BIG_DBL. If 
188c0 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20  a plan is found 
188d0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
188e0 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
188f0 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
18900 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
18910 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
18920 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
18930 58 45 44 20 63 6c 61 75 73 65 20 28 70 53 72 63  XED clause (pSrc
18940 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30 29  ->notIndexed!=0)
18950 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f   was attached to
18960 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69   the table .** i
18970 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
18980 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20  tement, then no 
18990 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73  indexes are cons
189a0 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c  idered. However,
189b0 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65   the .** selecte
189c0 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c  d plan may still
189d0 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   take advantage 
189e0 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
189f0 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
18a00 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  y.** index..*/.s
18a10 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 42  tatic void bestB
18a20 74 72 65 65 49 6e 64 65 78 28 0a 20 20 50 61 72  treeIndex(.  Par
18a30 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18a40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18a50 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
18a60 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
18a70 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
18a80 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
18a90 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
18aa0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18ab0 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
18ac0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
18ad0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
18ae0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
18af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
18b00 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20   of cursors not 
18b10 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e  available for in
18b20 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
18b30 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
18b40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
18b50 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
18b60 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
18b70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
18b80 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
18b90 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
18ba0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
18bb0 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
18bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
18bd0 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
18be0 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lan */.){.  int 
18bf0 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
18c00 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
18c10 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
18c20 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
18c30 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
18c40 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
18c50 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
18c60 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
18c70 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
18c80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
18c90 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72    /* Copy of pPr
18ca0 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72  obe, or zero for
18cb0 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   IPK index */.  
18cc0 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20  int eqTermMask; 
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18ce0 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76  urrent mask of v
18cf0 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
18d00 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
18d10 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20   idxEqTermMask; 
18d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18d30 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  x mask of valid 
18d40 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
18d50 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  rs */.  Index sP
18d60 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
18d70 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
18d80 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
18d90 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
18da0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
18db0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
18dc0 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
18dd0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18de0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
18df0 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  nt aiColumnPk = 
18e00 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
18e10 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
18e20 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
18e30 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46  dex */.  int wsF
18e40 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  lagMask;        
18e50 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20       /* Allowed 
18e60 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e  flags in pCost->
18e70 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a  plan.wsFlag */..
18e80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
18e90 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f  the cost to a wo
18ea0 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a  rst-case value *
18eb0 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74  /.  memset(pCost
18ec0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
18ed0 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72  st));.  pCost->r
18ee0 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
18ef0 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20  G_DBL;..  /* If 
18f00 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69  the pSrc table i
18f10 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
18f20 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
18f30 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74   then we may not
18f40 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64  .  ** use an ind
18f50 65 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53  ex to satisfy IS
18f60 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
18f70 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  s on that table.
18f80 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62    This is.  ** b
18f90 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d  ecause columns m
18fa0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
18fb0 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61  g NULL if the ta
18fc0 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ble does not mat
18fd0 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63  ch -.  ** a circ
18fe0 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74  umstance which t
18ff0 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
19000 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72  help us discover
19010 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e  .  Ticket #2177.
19020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  .  */.  if( pSrc
19030 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
19040 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45  LEFT ){.    idxE
19050 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
19060 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  Q|WO_IN;.  }else
19070 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
19080 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
19090 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  N|WO_ISNULL;.  }
190a0 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
190b0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
190c0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
190d0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
190e0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
190f0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
19100 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70  Idx = pProbe = p
19110 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Src->pIndex;.   
19120 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
19130 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
19140 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
19150 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
19160 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
19170 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
19180 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
19190 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
191a0 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
191b0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
191c0 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
191d0 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
191e0 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
191f0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
19200 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
19210 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
19220 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
19230 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
19240 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
19250 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
19260 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
19270 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
19280 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192a0 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
192b0 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
192c0 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
192d0 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
192e0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
192f0 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
19300 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
19310 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
19320 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
19330 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
19340 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
19350 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
19360 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72  sPk.pTable = pSr
19370 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52  c->pTab;.    aiR
19380 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72  owEstPk[0] = pSr
19390 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
193a0 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
193b0 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
193c0 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
193d0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
193e0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
193f0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
19400 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
19410 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
19420 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
19430 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
19440 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
19450 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
19460 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
19470 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
19480 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
19490 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
194a0 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
194b0 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
194c0 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45 52   ~(.        WHER
194d0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
194e0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
194f0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48  E_COLUMN_NULL|WH
19500 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
19510 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65  .    );.    eqTe
19520 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
19530 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d  O_IN;.    pIdx =
19540 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   0;.  }..  /* Lo
19550 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
19560 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ces looking for 
19570 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20  the best one to 
19580 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  use.  */.  for(;
19590 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50   pProbe; pIdx=pP
195a0 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
195b0 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  xt){.    const u
195c0 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f  nsigned int * co
195d0 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70  nst aiRowEst = p
195e0 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b  Probe->aiRowEst;
195f0 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
19600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19610 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
19620 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20  g pProbe */.    
19630 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
19640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
19650 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
19660 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
19670 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75  t set */.    dou
19680 62 6c 65 20 6c 6f 67 31 30 4e 3b 20 20 20 20 20  ble log10N;     
19690 20 20 20 20 20 20 20 20 20 2f 2a 20 62 61 73 65           /* base
196a0 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  -10 logarithm of
196b0 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20   nRow (inexact) 
196c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20  */.    int rev; 
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
196f0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
19700 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77  der */.    int w
19710 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  sFlags = 0;.    
19720 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
19730 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
19740 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
19750 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
19760 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f  based on the pro
19770 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a  perties of.    *
19780 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  * index being ev
19790 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72  aluated. They ar
197a0 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64  e then used to d
197b0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70  etermine the exp
197c0 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73  ected.    ** cos
197d0 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  t and number of 
197e0 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  rows returned.. 
197f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45     **.    **  nE
19800 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
19810 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
19820 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
19830 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
19840 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
19850 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
19860 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
19870 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
19880 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
19890 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
198a0 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
198b0 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
198c0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
198d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
198e0 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
198f0 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
19900 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
19910 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
19920 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
19930 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
19940 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
19950 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
19960 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
19970 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
19980 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
19990 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
199a0 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
199b0 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
199c0 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
199d0 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
199e0 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
199f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19a00 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
19a10 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
19a20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
19a30 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
19a40 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
19a50 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
19a60 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
19a70 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
19a80 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
19a90 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
19aa0 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
19ab0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
19ac0 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
19ad0 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
19ae0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
19af0 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
19b00 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
19b10 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
19b20 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
19b30 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
19b40 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
19b50 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
19b60 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
19b70 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
19b80 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
19b90 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
19ba0 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
19bb0 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
19bc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19bd0 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
19be0 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
19bf0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
19c00 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
19c10 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
19c20 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
19c30 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
19c40 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
19c50 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
19c60 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
19c70 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
19c80 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
19c90 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
19ca0 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
19cb0 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
19cc0 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
19cd0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
19ce0 20 20 65 73 74 42 6f 75 6e 64 3a 0a 20 20 20 20    estBound:.    
19cf0 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
19d00 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  e on the amount 
19d10 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
19d20 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
19d30 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20 20 20  ed.  A.    **   
19d40 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20 6d 65   value of 100 me
19d50 61 6e 73 20 74 68 65 20 65 6e 74 69 72 65 20 74  ans the entire t
19d60 61 62 6c 65 20 69 73 20 73 65 61 72 63 68 65 64  able is searched
19d70 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73 74 72 61  .  Range constra
19d80 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6d  ints.    **    m
19d90 69 67 68 74 20 72 65 64 75 63 65 20 74 68 69 73  ight reduce this
19da0 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73 73   to a value less
19db0 20 74 68 61 6e 20 31 30 30 20 74 6f 20 69 6e 64   than 100 to ind
19dc0 69 63 61 74 65 20 74 68 61 74 20 6f 6e 6c 79 0a  icate that only.
19dd0 20 20 20 20 2a 2a 20 20 20 20 61 20 66 72 61 63      **    a frac
19de0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
19df0 65 20 6e 65 65 64 73 20 73 65 61 72 63 68 69 6e  e needs searchin
19e00 67 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e  g.  In the absen
19e10 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20  ce of.    **    
19e20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41  sqlite_stat2 ANA
19e30 4c 59 5a 45 20 64 61 74 61 2c 20 61 20 73 69 6e  LYZE data, a sin
19e40 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  gle inequality r
19e50 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
19e60 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63  h.    **    spac
19e70 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 20 6f  e to 1/4rd its o
19e80 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20 20 53  riginal size.  S
19e90 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74 72 61  o an x>? constra
19ea0 69 6e 74 20 72 65 64 75 63 65 73 0a 20 20 20 20  int reduces.    
19eb0 2a 2a 20 20 20 20 65 73 74 42 6f 75 6e 64 20 74  **    estBound t
19ec0 6f 20 32 35 2e 20 20 54 77 6f 20 63 6f 6e 73 74  o 25.  Two const
19ed0 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
19ee0 78 3c 3f 29 20 72 65 64 75 63 65 20 65 73 74 42  x<?) reduce estB
19ef0 6f 75 6e 64 20 74 6f 20 36 2e 0a 20 20 20 20 2a  ound to 6..    *
19f00 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a  *.    **  bSort:
19f10 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f     .    **    Bo
19f20 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74  olean. True if t
19f30 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
19f40 20 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20   BY clause that 
19f50 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20  will require an 
19f60 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72  .    **    exter
19f70 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73  nal sort (i.e. s
19f80 63 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  canning the inde
19f90 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  x being evaluate
19fa0 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20  d will not .    
19fb0 2a 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20  **    correctly 
19fc0 6f 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a  order records)..
19fd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
19fe0 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20  Lookup: .    ** 
19ff0 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1a000 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   if a table look
1a010 75 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66  up is required f
1a020 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e  or each index en
1a030 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69  try.    **    vi
1a040 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72  sited.  In other
1a050 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20   words, true if 
1a060 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f  this is not a co
1a070 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
1a080 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20    **    This is 
1a090 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72  always false for
1a0a0 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
1a0b0 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20  ry key index of 
1a0c0 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  a table..    ** 
1a0d0 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64     For other ind
1a0e0 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65  exes, it is true
1a0f0 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20   unless all the 
1a100 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
1a110 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75  able.    **    u
1a120 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  sed by the SELEC
1a130 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  T statement are 
1a140 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
1a150 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20  ndex (such an.  
1a160 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73    **    index is
1a170 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72   sometimes descr
1a180 69 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69  ibed as a coveri
1a190 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a  ng index)..    *
1a1a0 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
1a1b0 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65  , given the inde
1a1c0 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1a1d0 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66   second of the f
1a1e0 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a  ollowing .    **
1a1f0 20 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20      two queries 
1a200 72 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62  requires table b
1a210 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  -tree lookups in
1a220 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74   order to find t
1a230 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
1a240 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20     of column c, 
1a250 62 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f  but the first do
1a260 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63  es not because c
1a270 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61  olumns a and b a
1a280 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74  re.    **    bot
1a290 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  h available in t
1a2a0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
1a2b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a2c0 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
1a2d0 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52     FROM tbl WHER
1a2e0 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20  E a = 1;.    ** 
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
1a300 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
1a310 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
1a320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1a330 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
1a340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a350 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1a360 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 69  terms matching i
1a370 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1a380 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20  bInEst = 0;     
1a390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a3a0 65 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45  e if "x IN (SELE
1a3b0 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a  CT...)" seen */.
1a3c0 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d      int nInMul =
1a3d0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1a3e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
1a3f0 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69  istinct equaliti
1a400 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  es to lookup */.
1a410 20 20 20 20 69 6e 74 20 65 73 74 42 6f 75 6e 64      int estBound
1a420 20 3d 20 31 30 30 3b 20 20 20 20 20 20 20 20 20   = 100;         
1a430 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72    /* Estimated r
1a440 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72  eduction in sear
1a450 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ch space */.    
1a460 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20  int nBound = 0; 
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a480 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65   Number of range
1a490 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65   constraints see
1a4a0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f  n */.    int bSo
1a4b0 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rt = 0;         
1a4c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a4d0 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20  f external sort 
1a4e0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
1a4f0 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b  int bLookup = 0;
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a510 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63   True if not a c
1a520 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1a530 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1a540 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1a550 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
1a560 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1a570 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65   clause */.#ifde
1a580 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a590 53 54 41 54 32 0a 20 20 20 20 57 68 65 72 65 54  STAT2.    WhereT
1a5a0 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20  erm *pFirstTerm 
1a5b0 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  = 0;    /* First
1a5c0 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74   term matching t
1a5d0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64  he index */.#end
1a5e0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72  if..    /* Deter
1a5f0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20  mine the values 
1a600 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75  of nEq and nInMu
1a610 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71  l */.    for(nEq
1a620 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  =0; nEq<pProbe->
1a630 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b  nColumn; nEq++){
1a640 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1a650 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
1a660 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
1a670 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1a680 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1a690 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c  ady, eqTermMask,
1a6a0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   pIdx);.      if
1a6b0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
1a6c0 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67  ak;.      wsFlag
1a6d0 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55  s |= (WHERE_COLU
1a6e0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  MN_EQ|WHERE_ROWI
1a6f0 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69 66 28  D_EQ);.      if(
1a700 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1a710 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
1a720 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1a730 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1a740 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1a750 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
1a760 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
1a770 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1a780 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1a790 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1a7a0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
1a7b0 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75  ECT ...)":  Assu
1a7c0 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  me the SELECT re
1a7d0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
1a7e0 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1a7f0 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
1a800 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
1a810 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1a820 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
1a830 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
1a840 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1a850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1a860 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
1a870 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
1a880 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1a890 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  *= pExpr->x.pLis
1a8a0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1a8b0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1a8c0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1a8d0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1a8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1a8f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
1a900 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
1a910 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1a920 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20  ENABLE_STAT2.   
1a930 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26     if( nEq==0 &&
1a940 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65   pProbe->aSample
1a950 20 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20   ) pFirstTerm = 
1a960 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  pTerm;.#endif.  
1a970 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72      used |= pTer
1a980 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1a990 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
1a9a0 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
1a9b0 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a  e of estBound. *
1a9c0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
1a9d0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
1a9e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1a9f0 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
1aa00 6e 45 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq];.      if( 
1aa10 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1aa20 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
1aa30 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
1aa40 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20  GT|WO_GE, pIdx) 
1aa50 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
1aa60 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e  Term *pTop = fin
1aa70 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1aa80 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
1aa90 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29  _LT|WO_LE, pIdx)
1aaa0 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
1aab0 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64  erm *pBtm = find
1aac0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1aad0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
1aae0 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b  GT|WO_GE, pIdx);
1aaf0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61  .        whereRa
1ab00 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
1ab10 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20  e, pProbe, nEq, 
1ab20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 65 73 74  pBtm, pTop, &est
1ab30 42 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Bound);.        
1ab40 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20  if( pTop ){.    
1ab50 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31        nBound = 1
1ab60 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  ;.          wsFl
1ab70 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
1ab80 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
1ab90 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e    used |= pTop->
1aba0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1abb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1abc0 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20  f( pBtm ){.     
1abd0 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20       nBound++;. 
1abe0 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
1abf0 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
1ac00 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75  MIT;.          u
1ac10 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65  sed |= pBtm->pre
1ac20 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1ac30 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c    }.        wsFl
1ac40 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1ac50 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
1ac60 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
1ac70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1ac80 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45   if( pProbe->onE
1ac90 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
1aca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1acb0 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
1acc0 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
1acd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
1ace0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
1acf0 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LUMN_NULL );.   
1ad00 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
1ad10 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1ad20 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1ad30 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NULL))==0 ){.   
1ad40 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1ad50 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
1ad60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ad70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1ad80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1ad90 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  se and the index
1ada0 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
1adb0 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61  d will.    ** na
1adc0 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77  turally scan row
1add0 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  s in the require
1ade0 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  d order, set the
1adf0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61   appropriate fla
1ae00 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46  gs.    ** in wsF
1ae10 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  lags. Otherwise,
1ae20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1ae30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ae40 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20  but the index.  
1ae50 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72    ** will scan r
1ae60 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65 72 65  ows in a differe
1ae70 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68  nt order, set th
1ae80 65 20 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65  e bSort variable
1ae90 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  .  */.    if( pO
1aea0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1aeb0 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57  if( (wsFlags & W
1aec0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
1aed0 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 69 73  =0.        && is
1aee0 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61  SortingIndex(pPa
1aef0 72 73 65 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53  rse, pWC->pMaskS
1af00 65 74 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72  et, pProbe, iCur
1af10 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af30 20 20 20 20 20 20 6e 45 71 2c 20 77 73 46 6c 61        nEq, wsFla
1af40 67 73 2c 20 26 72 65 76 29 0a 20 20 20 20 20 20  gs, &rev).      
1af50 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
1af60 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49  gs |= WHERE_ROWI
1af70 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  D_RANGE|WHERE_CO
1af80 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
1af90 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
1afa0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65    wsFlags |= (re
1afb0 76 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53  v ? WHERE_REVERS
1afc0 45 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  E : 0);.      }e
1afd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 53 6f  lse{.        bSo
1afe0 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rt = 1;.      }.
1aff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b000 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75   currently calcu
1b010 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20  lating the cost 
1b020 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  of using an inde
1b030 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20  x (not the IPK. 
1b040 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65     ** index), de
1b050 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72  termine if all r
1b060 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64  equired column d
1b070 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69  ata may be obtai
1b080 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20  ned without .   
1b090 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 61   ** using the ma
1b0a0 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69  in table (i.e. i
1b0b0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
1b0c0 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a   covering.    **
1b0d0 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20   index for this 
1b0e0 71 75 65 72 79 29 2e 20 49 66 20 69 74 20 69 73  query). If it is
1b0f0 2c 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f  , set the WHERE_
1b100 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e  IDX_ONLY flag in
1b110 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e  .    ** wsFlags.
1b120 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
1b130 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69  the bLookup vari
1b140 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a  able to true.  *
1b150 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26  /.    if( pIdx &
1b160 26 20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  & wsFlags ){.   
1b170 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
1b180 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  Src->colUsed;.  
1b190 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1b1a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
1b1b0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
1b1c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
1b1d0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1b1e0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
1b1f0 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20  x<BMS-1 ){.     
1b200 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69       m &= ~(((Bi
1b210 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20  tmask)1)<<x);.  
1b220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b230 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29        if( m==0 )
1b240 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
1b250 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
1b260 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1b270 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75  {.        bLooku
1b280 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 1;.      }. 
1b290 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1b2a0 20 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   ** Estimate the
1b2b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1b2c0 6f 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20  of output.  For 
1b2d0 61 6e 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  an "x IN (SELECT
1b2e0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e  ...)".    ** con
1b2f0 73 74 72 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20  straint, do not 
1b300 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65  let the estimate
1b310 20 65 78 63 65 65 64 20 68 61 6c 66 20 74 68 65   exceed half the
1b320 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1b330 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
1b340 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 28 61  Row = (double)(a
1b350 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e  iRowEst[nEq] * n
1b360 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69 66 28 20  InMul);.    if( 
1b370 62 49 6e 45 73 74 20 26 26 20 6e 52 6f 77 2a 32  bInEst && nRow*2
1b380 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a  >aiRowEst[0] ){.
1b390 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 61 69 52        nRow = aiR
1b3a0 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20  owEst[0]/2;.    
1b3b0 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29    nInMul = (int)
1b3c0 28 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45 73 74  (nRow / aiRowEst
1b3d0 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23  [nEq]);.    }..#
1b3e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b3f0 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 2f 2a  BLE_STAT2.    /*
1b400 20 49 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   If the constrai
1b410 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
1b420 6d 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 68 69  m x=VALUE and hi
1b430 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64  stogram.    ** d
1b440 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
1b450 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74   for column x, t
1b460 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62 65 20  hen it might be 
1b470 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20  possible.    ** 
1b480 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
1b490 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20  estimate on the 
1b4a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 62  number of rows b
1b4b0 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56  ased on.    ** V
1b4c0 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d  ALUE and how com
1b4d0 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65 20 69  mon that value i
1b4e0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  s according to t
1b4f0 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20  he histogram..  
1b500 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f    */.    if( nRo
1b510 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20 6e  w>(double)1 && n
1b520 45 71 3d 3d 31 20 26 26 20 70 46 69 72 73 74 54  Eq==1 && pFirstT
1b530 65 72 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm!=0 ){.      
1b540 69 66 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e  if( pFirstTerm->
1b550 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1b560 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  EQ|WO_ISNULL) ){
1b570 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b580 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1b590 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
1b5a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1b5b0 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1b5c0 3e 70 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >pOperator==WO_I
1b5d0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  SNULL );.       
1b5e0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
1b5f0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1b600 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70  e, pFirstTerm->p
1b610 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
1b620 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Row);.      }els
1b630 65 20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d  e if( pFirstTerm
1b640 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1b650 49 4e 20 26 26 20 62 49 6e 45 73 74 3d 3d 30 20  IN && bInEst==0 
1b660 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ){.        where
1b670 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
1b680 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74  , pProbe, pFirst
1b690 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  Term->pExpr->x.p
1b6a0 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  List, &nRow);.  
1b6b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
1b6c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1b6d0 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 20 20  BLE_STAT2 */..  
1b6e0 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20    /* Adjust the 
1b6f0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1b700 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61   rows and downwa
1b710 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f  rd to reflect ro
1b720 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  ws.    ** that a
1b730 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20 72  re excluded by r
1b740 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1b750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f  ..    */.    nRo
1b760 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f 75  w = (nRow * (dou
1b770 62 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f 20  ble)estBound) / 
1b780 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20  (double)100;.   
1b790 20 69 66 28 20 6e 52 6f 77 3c 31 20 29 20 6e 52   if( nRow<1 ) nR
1b7a0 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  ow = 1;..    /* 
1b7b0 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20  Experiments run 
1b7c0 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64  on real SQLite d
1b7d0 61 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68  atabases show th
1b7e0 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64  at the time need
1b7f0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20  ed.    ** to do 
1b800 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
1b810 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20  to locate a row 
1b820 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  in a table or in
1b830 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20  dex is roughly. 
1b840 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74     ** log10(N) t
1b850 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f  imes the time to
1b860 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72   move from one r
1b870 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ow to the next r
1b880 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  ow within.    **
1b890 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1b8a0 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74  x.  The actual t
1b8b0 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77  imes can vary, w
1b8c0 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a  ith the size of.
1b8d0 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62      ** records b
1b8e0 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e  eing an importan
1b8f0 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20  t factor.  Both 
1b900 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68  moves and search
1b910 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c  es are.    ** sl
1b920 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72  ower with larger
1b930 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d   records, presum
1b940 61 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77  ably because few
1b950 65 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20  er records fit. 
1b960 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67     ** on one pag
1b970 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65  e and hence more
1b980 20 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62   pages have to b
1b990 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a  e fetched..    *
1b9a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41  *.    ** The ANA
1b9b0 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  LYZE command and
1b9c0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
1b9d0 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61  1 and sqlite_sta
1b9e0 74 32 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20  t2 tables do.   
1b9f0 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20   ** not give us 
1ba00 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61  data on the rela
1ba10 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61  tive sizes of ta
1ba20 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ble and index re
1ba30 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f  cords..    ** So
1ba40 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f   this computatio
1ba50 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20  n assumes table 
1ba60 72 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75  records are abou
1ba70 74 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20  t twice as big. 
1ba80 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72     ** as index r
1ba90 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20  ecords.    */.  
1baa0 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
1bab0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
1bac0 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
1bad0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
1bae0 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
1baf0 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66  n is a number of
1bb00 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e 73   move operations
1bb10 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a 20   equal.      ** 
1bb20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1bb30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1bb40 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
1bb50 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e 20     ** We add an 
1bb60 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70 65  additional 4x pe
1bb70 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74 61  nalty to full ta
1bb80 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69 73  ble scans.  This
1bb90 20 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a 2a   causes.      **
1bba0 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74 69   the cost functi
1bbb0 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68 65  on to err on the
1bbc0 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69 6e   side of choosin
1bbd0 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72 0a  g an index over.
1bbe0 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69 6e        ** choosin
1bbf0 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20 20  g a full scan.  
1bc00 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63 61  This 4x full-sca
1bc10 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e 20  n penalty is an 
1bc20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20 2a  arguable.      *
1bc30 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20 6f  * decision and o
1bc40 6e 65 20 77 68 69 63 68 20 77 65 20 65 78 70 65  ne which we expe
1bc50 63 74 20 74 6f 20 72 65 76 69 73 69 74 20 69 6e  ct to revisit in
1bc60 20 74 68 65 20 66 75 74 75 72 65 2e 20 20 42 75   the future.  Bu
1bc70 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73 65  t.      ** it se
1bc80 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69 6e  ems to be workin
1bc90 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61 74  g well enough at
1bca0 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20   the moment..   
1bcb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73 74     */.      cost
1bcc0 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34   = aiRowEst[0]*4
1bcd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bce0 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c     log10N = estL
1bcf0 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
1bd00 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  .      cost = nR
1bd10 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ow;.      if( pI
1bd20 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  dx ){.        if
1bd30 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20  ( bLookup ){.   
1bd40 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e         /* For an
1bd50 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f   index lookup fo
1bd60 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c  llowed by a tabl
1bd70 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  e lookup:.      
1bd80 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c      **    nInMul
1bd90 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20   index searches 
1bda0 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72  to find the star
1bdb0 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20  t of each index 
1bdc0 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20  range.          
1bdd0 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1bde0 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64   through the ind
1bdf0 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ex.          ** 
1be00 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65   + nRow table se
1be10 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70  arches to lookup
1be20 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
1be30 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64   using the rowid
1be40 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1be50 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20          cost += 
1be60 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77 29 2a  (nInMul + nRow)*
1be70 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
1be80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1be90 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72 69   /* For a coveri
1bea0 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20 20  ng index:.      
1beb0 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d 75      **     nInMu
1bec0 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73  l index searches
1bed0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69   to find the ini
1bee0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
1bef0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52 6f        **   + nRo
1bf00 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20  w steps through 
1bf10 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
1bf20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1bf30 20 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a   cost += nInMul*
1bf40 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20  log10N;.        
1bf50 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1bf60 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20         /* For a 
1bf70 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65  rowid primary ke
1bf80 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20  y lookup:.      
1bf90 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20    **    nInMult 
1bfa0 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1bfb0 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69  o find the initi
1bfc0 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  al entry for eac
1bfd0 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  h range.        
1bfe0 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73  **  + nRow steps
1bff0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62   through the tab
1c000 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  le.        */.  
1c010 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49        cost += nI
1c020 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20  nMul*log10N;.   
1c030 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c040 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73  /* Add in the es
1c050 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20  timated cost of 
1c060 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75  sorting the resu
1c070 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65  lt.  Actual expe
1c080 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  rimental.    ** 
1c090 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20  measurements of 
1c0a0 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61  sorting performa
1c0b0 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68  nce in SQLite sh
1c0c0 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  ow that sorting 
1c0d0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73  time.    ** adds
1c0e0 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f   C*N*log10(N) to
1c0f0 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65   the cost, where
1c100 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1c110 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a   of rows to be .
1c120 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e      ** sorted an
1c130 64 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20  d C is a factor 
1c140 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64  between 1.95 and
1c150 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73   4.3.  We will s
1c160 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  plit the.    ** 
1c170 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73  difference and s
1c180 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a  elect C of 3.0..
1c190 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
1c1a0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  Sort ){.      co
1c1b0 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  st += nRow*estLo
1c1c0 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d  g(nRow)*3;.    }
1c1d0 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  ..    /**** Cost
1c1e0 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
1c1f0 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
1c200 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
1c210 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1c220 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c  e are additional
1c230 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1c240 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
1c250 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1c260 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63   used with the c
1c270 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75  urrent index, bu
1c280 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f  t which might lo
1c290 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  wer the number. 
1c2a0 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20     ** of output 
1c2b0 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65  rows, adjust the
1c2c0 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f   nRow value acco
1c2d0 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f  rdingly.  This o
1c2e0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74  nly .    ** matt
1c2f0 65 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65  ers if the curre
1c300 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  nt index is the 
1c310 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f  least costly, so
1c320 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20   do not bother. 
1c330 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1c340 73 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61  step if we alrea
1c350 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64  dy know this ind
1c360 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  ex will not be c
1c370 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c  hosen..    ** Al
1c380 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65  so, never reduce
1c390 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1c3a0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73  count below 2 us
1c3b0 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20  ing this step.. 
1c3c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20     **.    ** It 
1c3d0 69 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74  is critical that
1c3e0 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   the notValid ma
1c3f0 73 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20  sk be used here 
1c400 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1c410 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d  * the notReady m
1c420 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75  ask.  When compu
1c430 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c  ting an "optimal
1c440 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74  " index, the not
1c450 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73  Ready.    ** mas
1c460 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65  k will only have
1c470 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74   one bit set - t
1c480 68 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63  he bit for the c
1c490 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
1c4a0 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69    ** The notVali
1c4b0 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f  d mask, on the o
1c4c0 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79  ther hand, alway
1c4d0 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73  s has all bits s
1c4e0 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61  et for.    ** ta
1c4f0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  bles that are no
1c500 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  t in outer loops
1c510 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69  .  If notReady i
1c520 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  s used here inst
1c530 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f  ead.    ** of no
1c540 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f  tValid, then a o
1c550 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1c560 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e  t depends on inn
1c570 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20  er joins loops. 
1c580 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1c590 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65  elected even whe
1c5a0 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  n there exists a
1c5b0 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  n optimal index 
1c5c0 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
1c5d0 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e  no such dependen
1c5e0 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  cy..    */.    i
1c5f0 66 28 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73  f( nRow>2 && cos
1c600 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  t<=pCost->rCost 
1c610 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c630 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1c640 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
1c650 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71  nt nSkipEq = nEq
1c660 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1c670 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73  umber of == cons
1c680 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20  traints to skip 
1c690 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
1c6a0 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64  ipRange = nBound
1c6b0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1c6c0 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73  of < constraints
1c6d0 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20   to skip */.    
1c6e0 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61    Bitmask thisTa
1c6f0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1c700 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72  * Bitmap for pSr
1c710 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73  c */..      this
1c720 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57  Tab = getMask(pW
1c730 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
1c740 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  r);.      for(pT
1c750 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
1c760 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32  C->nTerm; nRow>2
1c770 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72   && k; k--, pTer
1c780 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1c790 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1c7a0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1c7b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c7c0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1c7d0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56  prereqAll & notV
1c7e0 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62 20 29  alid)!=thisTab )
1c7f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1c800 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1c810 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1c820 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1c830 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
1c840 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20  f( nSkipEq ){.  
1c850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
1c860 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 45  ore the first nE
1c870 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  q equality match
1c880 65 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  es since the ind
1c890 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1c8a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1c8b0 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1c8c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1c8d0 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20   nSkipEq--;.    
1c8e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
1c900 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  me each addition
1c910 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63  al equality matc
1c920 68 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  h reduces the re
1c930 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1c940 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1c950 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a  a factor of 10 *
1c960 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1c970 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20  ow /= 10;.      
1c980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1c990 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
1c9a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1c9b0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
1c9c0 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _GE) ){.        
1c9d0 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65    if( nSkipRange
1c9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c9f0 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69  /* Ignore the fi
1ca00 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72  rst nSkipRange r
1ca10 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1ca20 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1ca30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1ca40 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1ca50 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1ca60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1ca70 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20  SkipRange--;.   
1ca80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ca90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
1caa0 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f  ume each additio
1cab0 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  nal range constr
1cac0 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65  aint reduces the
1cad0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
1cae0 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20      ** set size 
1caf0 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  by a factor of 3
1cb00 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65  .  Indexed range
1cb10 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64   constraints red
1cb20 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1cb30 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ** the search sp
1cb40 61 63 65 20 62 79 20 61 20 6c 61 72 67 65 72 20  ace by a larger 
1cb50 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d  factor: 4.  We m
1cb60 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67  ake indexed rang
1cb70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1cb80 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20   more selective 
1cb90 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65  intentionally be
1cba0 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  cause of the sub
1cbb0 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20 20 20  jective .       
1cbc0 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74       ** observat
1cbd0 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64  ion that indexed
1cbe0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1cbf0 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f  ts really are mo
1cc00 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1cc10 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70  * selective in p
1cc20 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72  ractice, on aver
1cc30 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
1cc40 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20      nRow /= 3;. 
1cc50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cc60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
1cc70 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
1cc80 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  O_NOOP ){.      
1cc90 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72      /* Any other
1cca0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65   expression lowe
1ccb0 72 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  rs the output ro
1ccc0 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20  w count by half 
1ccd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f  */.          nRo
1cce0 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  w /= 2;.        
1ccf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1cd00 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f  if( nRow<2 ) nRo
1cd10 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20  w = 2;.    }... 
1cd20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a     WHERETRACE((.
1cd30 20 20 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e        "%s(%s): n
1cd40 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20  Eq=%d nInMul=%d 
1cd50 65 73 74 42 6f 75 6e 64 3d 25 64 20 62 53 6f 72  estBound=%d bSor
1cd60 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20  t=%d bLookup=%d 
1cd70 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a  wsFlags=0x%x\n".
1cd80 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20        "         
1cd90 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20  notReady=0x%llx 
1cda0 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77  log10N=%.1f nRow
1cdb0 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 20  =%.1f cost=%.1f 
1cdc0 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a  used=0x%llx\n",.
1cdd0 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62        pSrc->pTab
1cde0 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f  ->zName, (pIdx ?
1cdf0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
1ce00 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45  ipk"), .      nE
1ce10 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42 6f  q, nInMul, estBo
1ce20 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f  und, bSort, bLoo
1ce30 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20  kup, wsFlags,.  
1ce40 20 20 20 20 6e 6f 74 52 65 61 64 79 2c 20 6c 6f      notReady, lo
1ce50 67 31 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f 73 74  g10N, nRow, cost
1ce60 2c 20 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a  , used.    ));..
1ce70 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1ce80 6e 64 65 78 20 69 73 20 74 68 65 20 62 65 73 74  ndex is the best
1ce90 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f   we have seen so
1cea0 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72   far, then recor
1ceb0 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  d this.    ** in
1cec0 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74  dex and its cost
1ced0 20 69 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74   in the pCost st
1cee0 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1cef0 20 20 20 20 69 66 28 20 28 21 70 49 64 78 20 7c      if( (!pIdx |
1cf00 7c 20 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20  | wsFlags).     
1cf10 26 26 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e  && (cost<pCost->
1cf20 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d  rCost || (cost<=
1cf30 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20  pCost->rCost && 
1cf40 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e  nRow<pCost->plan
1cf50 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20  .nRow)).    ){. 
1cf60 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
1cf70 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
1cf80 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73  pCost->used = us
1cf90 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  ed;.      pCost-
1cfa0 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f  >plan.nRow = nRo
1cfb0 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
1cfc0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28  plan.wsFlags = (
1cfd0 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61  wsFlags&wsFlagMa
1cfe0 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  sk);.      pCost
1cff0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71  ->plan.nEq = nEq
1d000 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
1d010 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
1d020 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  x;.    }..    /*
1d030 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
1d040 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1d050 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
1d060 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
1d070 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
1d080 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
1d090 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65  rc->pIndex ) bre
1d0a0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65  ak;..    /* Rese
1d0b0 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  t masks for the 
1d0c0 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68  next index in th
1d0d0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73  e loop */.    ws
1d0e0 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45  FlagMask = ~(WHE
1d0f0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
1d100 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a  E_ROWID_RANGE);.
1d110 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
1d120 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a   idxEqTermMask;.
1d130 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1d140 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
1d150 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
1d160 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1d170 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69  rder flag.  ** i
1d180 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65  s set, then reve
1d190 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 74 68  rse the order th
1d1a0 61 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  at the index wil
1d1b0 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a  l be scanned.  *
1d1c0 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73  * in. This is us
1d1d0 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69  ed for applicati
1d1e0 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68  on testing, to h
1d1f0 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20  elp find cases. 
1d200 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63   ** where applic
1d210 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20  ation behaviour 
1d220 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28  depends on the (
1d230 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72  undefined) order
1d240 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74   that.  ** SQLit
1d250 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  e outputs rows i
1d260 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65  n in the absence
1d270 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20   of an ORDER BY 
1d280 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
1d290 28 20 21 70 4f 72 64 65 72 42 79 20 26 26 20 70  ( !pOrderBy && p
1d2a0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1d2b0 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
1d2c0 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43  eOrder ){.    pC
1d2d0 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1d2e0 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
1d2f0 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  SE;.  }..  asser
1d300 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28  t( pOrderBy || (
1d310 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1d320 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1d330 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1d340 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  t( pCost->plan.u
1d350 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f  .pIdx==0 || (pCo
1d360 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1d370 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  &WHERE_ROWID_EQ)
1d380 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1d390 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
1d3a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73   .       || pCos
1d3b0 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
1d3c0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f  0 .       || pCo
1d3d0 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  st->plan.u.pIdx=
1d3e0 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20  =pSrc->pIndex . 
1d3f0 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43   );..  WHERETRAC
1d400 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69  E(("best index i
1d410 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28  s: %s\n", .    (
1d420 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46  (pCost->plan.wsF
1d430 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
1d440 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20  _FULLSCAN)==0 ? 
1d450 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20  "none" : .      
1d460 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
1d470 2e 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70  .pIdx ? pCost->p
1d480 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
1d490 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b  e : "ipk").  ));
1d4a0 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75  .  .  bestOrClau
1d4b0 73 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  seIndex(pParse, 
1d4c0 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1d4d0 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70  ady, notValid, p
1d4e0 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b  OrderBy, pCost);
1d4f0 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  .  bestAutomatic
1d500 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1d510 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1d520 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f  y, pCost);.  pCo
1d530 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1d540 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a   |= eqTermMask;.
1d550 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
1d560 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
1d570 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65   accessing table
1d580 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69   pSrc->pTab. Wri
1d590 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
1d5a0 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
1d5b0 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
1d5c0 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
1d5d0 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73   supplied .** as
1d5e0 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65   the last parame
1d5f0 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
1d600 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65  on may calculate
1d610 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20   the cost of.** 
1d620 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69  both real and vi
1d630 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e  rtual table scan
1d640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d650 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  d bestIndex(.  P
1d660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d680 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1d690 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1d6a0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
1d6b0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1d6c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1d6d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1d6e0 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
1d6f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1d700 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
1d710 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
1d720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1d730 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
1d740 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
1d750 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
1d760 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
1d770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1d780 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
1d790 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  le for any purpo
1d7a0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1d7b0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
1d7c0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1d7d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1d7e0 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d800 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
1d810 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e   plan */.){.#ifn
1d820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d830 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1d840 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  f( IsVirtual(pSr
1d850 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  c->pTab) ){.    
1d860 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1d870 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62  fo *p = 0;.    b
1d880 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
1d890 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1d8a0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
1d8b0 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
1d8c0 20 70 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20   pCost,&p);.    
1d8d0 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65  if( p->needToFre
1d8e0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
1d8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1d900 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  >idxStr);.    }.
1d910 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d920 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  e(pParse->db, p)
1d930 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1d940 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72  .  {.    bestBtr
1d950 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  eeIndex(pParse, 
1d960 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1d970 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70  ady, notValid, p
1d980 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b  OrderBy, pCost);
1d990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
1d9a0 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
1d9b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1d9c0 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
1d9d0 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
1d9e0 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
1d9f0 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
1da00 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
1da10 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
1da20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
1da30 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1da40 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
1da50 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
1da60 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
1da70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
1da80 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
1da90 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
1daa0 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
1dab0 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
1dac0 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
1dad0 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
1dae0 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
1daf0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
1db00 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
1db10 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
1db20 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
1db30 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
1db40 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
1db50 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
1db60 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
1db70 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
1db80 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
1db90 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
1dba0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
1dbb0 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
1dbc0 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
1dbd0 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
1dbe0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1dbf0 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
1dc00 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
1dc10 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d  sabled..**.** IM
1dc20 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1dc30 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e   R-24597-58655 N
1dc40 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65  o tests are done
1dc50 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20   for terms that 
1dc60 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c  are.** completel
1dc70 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  y satisfied by i
1dc80 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69  ndices..**.** Di
1dc90 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
1dca0 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
1dcb0 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
1dcc0 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
1dcd0 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
1dce0 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
1dcf0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1dd00 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
1dd10 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
1dd20 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
1dd30 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
1dd40 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
1dd50 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
1dd60 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
1dd70 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
1dd80 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
1dd90 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
1dda0 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
1ddb0 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
1ddc0 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
1ddd0 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
1dde0 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
1ddf0 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
1de00 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
1de10 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
1de20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
1de30 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
1de40 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
1de50 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
1de60 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
1de70 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
1de80 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
1de90 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
1dea0 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
1deb0 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
1dec0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1ded0 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
1dee0 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
1def0 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
1df00 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1df10 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1df20 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
1df30 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
1df40 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
1df50 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
1df60 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
1df70 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1df80 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
1df90 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
1dfa0 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
1dfb0 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
1dfc0 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
1dfd0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1dfe0 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
1dff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e000 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1e010 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
1e020 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
1e030 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
1e040 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
1e050 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
1e060 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
1e070 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
1e080 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
1e090 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
1e0a0 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
1e0b0 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
1e0c0 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
1e0d0 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
1e0e0 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
1e0f0 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
1e100 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
1e110 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
1e120 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
1e130 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
1e140 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e150 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
1e160 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
1e170 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
1e180 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
1e190 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
1e1a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e1b0 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
1e1c0 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
1e1d0 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
1e1e0 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
1e1f0 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
1e200 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1e210 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e220 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
1e230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1e240 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1e250 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1e260 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1e270 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
1e280 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
1e290 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
1e2a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
1e2b0 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
1e2c0 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
1e2d0 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
1e2e0 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
1e2f0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
1e300 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
1e310 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1e320 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
1e330 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
1e340 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
1e350 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
1e360 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1e370 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
1e380 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
1e390 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
1e3a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
1e3b0 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
1e3c0 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
1e3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e3e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
1e3f0 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
1e400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1e410 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
1e420 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
1e430 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1e440 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1e450 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
1e460 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
1e470 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1e480 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
1e490 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1e4a0 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
1e4b0 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
1e4c0 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
1e4d0 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
1e4e0 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
1e4f0 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
1e500 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
1e510 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1e520 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
1e530 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
1e540 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
1e550 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
1e560 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
1e570 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
1e580 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
1e590 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
1e5a0 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
1e5b0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
1e5c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
1e5d0 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
1e5e0 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
1e5f0 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
1e600 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
1e610 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
1e620 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
1e630 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
1e640 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
1e650 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e660 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1e670 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1e680 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
1e690 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
1e6a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1e6b0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1e6c0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1e6d0 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65  evel, /* When le
1e6e0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
1e6f0 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
1e700 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
1e710 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20  t iTarget       
1e720 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
1e730 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e  leave results in
1e740 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1e750 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20  /.){.  Expr *pX 
1e760 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1e770 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e780 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1e790 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   iReg;          
1e7a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1e7b0 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
1e7c0 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lts */..  assert
1e7d0 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20  ( iTarget>0 );. 
1e7e0 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1e7f0 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  EQ ){.    iReg =
1e800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e810 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1e820 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67  X->pRight, iTarg
1e830 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  et);.  }else if(
1e840 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
1e850 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d  LL ){.    iReg =
1e860 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71   iTarget;.    sq
1e870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e880 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
1e890 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
1e8a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1e8b0 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
1e8c0 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69  int eType;.    i
1e8d0 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72  nt iTab;.    str
1e8e0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
1e8f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  ..    assert( pX
1e900 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
1e910 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
1e920 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  t;.    eType = s
1e930 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
1e940 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29  x(pParse, pX, 0)
1e950 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d  ;.    iTab = pX-
1e960 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c  >iTable;.    sql
1e970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e980 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
1e990 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  b, 0);.    asser
1e9a0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  t( pLevel->plan.
1e9b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e9c0 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69  IN_ABLE );.    i
1e9d0 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  f( pLevel->u.in.
1e9e0 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nIn==0 ){.      
1e9f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
1ea00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1ea10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
1ea20 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
1ea30 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  n.nIn++;.    pLe
1ea40 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1ea50 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74  p =.       sqlit
1ea60 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1ea70 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
1ea80 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
1ea90 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
1eac0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d  >u.in.aInLoop[0]
1ead0 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  )*pLevel->u.in.n
1eae0 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  In);.    pIn = p
1eaf0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
1eb00 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
1eb10 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
1eb20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1eb30 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  n - 1;.      pIn
1eb40 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  ->iCur = iTab;. 
1eb50 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1eb60 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
1eb70 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
1eb80 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
1eb90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1eba0 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20  OP_Rowid, iTab, 
1ebb0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iReg);.      }el
1ebc0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d  se{.        pIn-
1ebd0 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c  >addrInTop = sql
1ebe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ebf0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
1ec00 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
1ec10 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ec20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1ec30 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
1ec40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ec50 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
1ec60 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
1ec70 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
1ec80 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1ec90 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
1eca0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
1ecb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1ecc0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
1ecd0 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
1ece0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
1ecf0 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  n.** index..**.*
1ed00 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
1ed10 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
1ed20 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
1ed30 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
1ed40 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
1ed50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ed60 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
1ed70 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
1ed80 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
1ed90 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
1eda0 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
1edb0 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
1edc0 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
1edd0 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
1ede0 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
1edf0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
1ee00 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
1ee10 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
1ee20 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
1ee30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1ee40 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
1ee50 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
1ee60 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
1ee70 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
1ee80 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
1ee90 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
1eea0 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
1eeb0 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1eec0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
1eed0 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
1eee0 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
1eef0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
1ef00 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
1ef10 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
1ef20 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
1ef30 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
1ef40 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
1ef50 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
1ef60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ef70 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
1ef80 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
1ef90 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
1efa0 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
1efb0 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
1efc0 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
1efd0 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
1efe0 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
1eff0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
1f000 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c  s allocates at l
1f010 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20  east one memory 
1f020 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73  cell and returns
1f030 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66  .** the index of
1f040 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
1f050 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  l. The code that
1f060 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72  .** calls this r
1f070 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20  outine will use 
1f080 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
1f090 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
1f0a0 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
1f0b0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
1f0c0 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
1f0d0 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
1f0e0 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
1f0f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
1f100 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
1f110 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
1f120 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
1f130 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a  nal.** use..**.*
1f140 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
1f150 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65  ng, *pzAff is se
1f160 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
1f170 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1f180 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74  g a.** copy of t
1f190 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
1f1a0 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65  ty string of the
1f1b0 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64   index allocated
1f1c0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
1f1d0 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63  3DbMalloc(). Exc
1f1e0 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20  ept, entries in 
1f1f0 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
1f200 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65  string associate
1f210 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69  d.** with equali
1f220 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ty constraints t
1f230 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66  hat use NONE aff
1f240 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f  inity are set to
1f250 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
1f260 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ONE. This is to 
1f270 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75  deal with SQL su
1f280 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
1f290 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
1f2a0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54  ATE TABLE t1(a T
1f2b0 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
1f2c0 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   b);.**   SELECT
1f2d0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20   ... FROM t1 AS 
1f2e0 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e  t2, t1 WHERE t1.
1f2f0 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20  a = t2.b;.**.** 
1f300 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1f310 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20  bove, the index 
1f320 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58  on t1(a) has TEX
1f330 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20  T affinity. But 
1f340 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67  since.** the rig
1f350 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht hand side of 
1f360 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1f370 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68  straint (t2.b) h
1f380 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79  as NONE affinity
1f390 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69  ,.** no conversi
1f3a0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74  on should be att
1f3b0 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73  empted before us
1f3c0 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65  ing a t2.b value
1f3d0 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61   as part of.** a
1f3e0 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74   key to search t
1f3f0 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20  he index. Hence 
1f400 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  the first byte i
1f410 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  n the returned a
1f420 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e  ffinity.** strin
1f430 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c  g in this exampl
1f440 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74  e would be set t
1f450 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  o SQLITE_AFF_NON
1f460 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1f470 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
1f480 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
1f490 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
1f4a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f4b0 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  t */.  WhereLeve
1f4c0 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20  l *pLevel,   /* 
1f4d0 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f  Which nested loo
1f4e0 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65  p of the FROM we
1f4f0 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20   are coding */. 
1f500 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1f510 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
1f520 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1f530 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1f540 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70  ,     /* Which p
1f550 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76  arts of FROM hav
1f560 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
1f570 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  oded */.  int nE
1f580 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
1f590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1f5a0 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
1f5b0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
1f5c0 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
1f5d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
1f5e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
1f5f0 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
1f600 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
1f610 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
1f620 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1f630 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
1f640 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
1f650 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
1f660 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
1f670 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64     /* The vm und
1f680 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1f690 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1f6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f6b0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
1f6c0 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
1f6d0 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
1f6e0 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
1f6f0 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
1f700 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
1f710 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
1f720 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1f730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1f740 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
1f750 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
1f760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f770 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1f780 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1f790 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1f7b0 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
1f7c0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67  /* Number of reg
1f7f0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
1f800 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  te */.  char *zA
1f810 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1f820 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1f830 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75  y string to retu
1f840 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  rn */..  /* This
1f850 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20   module is only 
1f860 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20  called on query 
1f870 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61  plans that use a
1f880 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73  n index. */.  as
1f890 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
1f8a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1f8b0 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
1f8c0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
1f8d0 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f  lan.u.pIdx;..  /
1f8e0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1f8f0 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
1f900 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
1f910 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
1f920 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
1f930 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
1f940 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
1f950 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
1f960 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20   + nExtraReg;.  
1f970 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1f980 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20  nReg;..  zAff = 
1f990 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1f9a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69  pParse->db, sqli
1f9b0 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
1f9c0 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20  Str(v, pIdx));. 
1f9d0 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20   if( !zAff ){.  
1f9e0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
1f9f0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1fa00 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61    }..  /* Evalua
1fa10 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  te the equality 
1fa20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
1fa30 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
1fa40 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b  >nColumn>=nEq );
1fa50 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45  .  for(j=0; j<nE
1fa60 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  q; j++){.    int
1fa70 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d   r1;.    int k =
1fa80 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1fa90 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  j];.    pTerm = 
1faa0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1fab0 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
1fac0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1fad0 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20  Flags, pIdx);.  
1fae0 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72    if( NEVER(pTer
1faf0 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20  m==0) ) break;. 
1fb00 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1fb10 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64  ing true for ind
1fb20 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64  ices with redund
1fb30 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20  ant columns. .  
1fb40 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20    ** Ex: CREATE 
1fb50 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
1fb60 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20  ,b,a); SELECT * 
1fb70 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
1fb80 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20  0 AND b=0; */.  
1fb90 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65    testcase( (pTe
1fba0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1fbb0 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a  RM_CODED)!=0 );.
1fbc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fbd0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1fbe0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
1fbf0 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
1fc00 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20  662 */.    r1 = 
1fc10 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
1fc20 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
1fc30 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b  pLevel, regBase+
1fc40 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1fc50 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1fc60 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1fc70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fc80 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fc90 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1fca0 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1fcb0 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1fcc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1fcd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fce0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1fcf0 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1fd00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1fd10 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1fd20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1fd30 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1fd40 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1fd50 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1fd60 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1fd70 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1fd80 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1fd90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1fda0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1fdb0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1fdc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fdd0 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
1fde0 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
1fdf0 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
1fe00 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
1fe10 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20  if( zAff ){.    
1fe20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1fe30 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1fe40 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d  Right, zAff[j])=
1fe50 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1fe60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1fe70 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1fe80 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1fe90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
1fea0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
1feb0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
1fec0 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
1fed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41   ){.          zA
1fee0 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
1fef0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
1ff00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ff10 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20  .  }.  *pzAff = 
1ff20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  zAff;.  return r
1ff30 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64  egBase;.}..#ifnd
1ff40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
1ff50 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  XPLAIN./*.** Thi
1ff60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
1ff70 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69  elper for explai
1ff80 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65  nIndexRange() be
1ff90 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68  low.**.** pStr h
1ffa0 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66  olds the text of
1ffb0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1ffc0 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64  hat we are build
1ffd0 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a  ing up one term.
1ffe0 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  ** at a time.  T
1fff0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
20000 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
20010 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78  he end of the ex
20020 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72  pression..** Ter
20030 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64  ms are separated
20040 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74   by AND so add t
20050 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f  he "AND" text fo
20060 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  r second and sub
20070 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73  sequent.** terms
20080 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
20090 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70   void explainApp
200a0 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63  endTerm(.  StrAc
200b0 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20  cum *pStr,      
200c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
200d0 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65  xt expression be
200e0 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69  ing built */.  i
200f0 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20  nt iTerm,       
20100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20110 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d  dex of this term
20120 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f  .  First is zero
20130 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20140 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20   *zColumn,      
20150 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
20160 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
20170 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20  st char *zOp    
20180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
20190 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
201a0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65   */.){.  if( iTe
201b0 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  rm ) sqlite3StrA
201c0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
201d0 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20   " AND ", 5);.  
201e0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
201f0 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c  ppend(pStr, zCol
20200 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69  umn, -1);.  sqli
20210 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
20220 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b  d(pStr, zOp, 1);
20230 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
20240 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22  umAppend(pStr, "
20250 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ?", 1);.}../*.**
20260 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c   Argument pLevel
20270 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72   describes a str
20280 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69  ategy for scanni
20290 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54  ng table pTab. T
202a0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
202b0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
202c0 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62  er to a string b
202d0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
202e0 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
202f0 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20  * of the subset 
20300 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63  of table rows sc
20310 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72  anned by the str
20320 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72  ategy in the for
20330 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65  m of an.** SQL e
20340 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69  xpression. Or, i
20350 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73  f all rows are s
20360 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20  canned, NULL is 
20370 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
20380 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
20390 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
203a0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
203b0 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e   t1 WHERE a=1 AN
203c0 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20  D b>2;.**.** is 
203d0 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73  run and there is
203e0 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c   an index on (a,
203f0 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66   b), then this f
20400 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20410 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69  a.** string simi
20420 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
20430 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a  "a=? AND b>?".**
20440 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
20450 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
20460 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
20470 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
20480 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  bMalloc()..** It
20490 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
204a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
204b0 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65  ller to free the
204c0 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20   buffer when it 
204d0 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
204e0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
204f0 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69  tic char *explai
20500 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69  nIndexRange(sqli
20510 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 65  te3 *db, WhereLe
20520 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61 62  vel *pLevel, Tab
20530 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68 65  le *pTab){.  Whe
20540 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d 20  rePlan *pPlan = 
20550 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20  &pLevel->plan;. 
20560 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
20570 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a   pPlan->u.pIdx;.
20580 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c 61    int nEq = pPla
20590 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c  n->nEq;.  int i,
205a0 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   j;.  Column *aC
205b0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
205c0 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e  .  int *aiColumn
205d0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c   = pIndex->aiCol
205e0 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  umn;.  StrAccum 
205f0 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d  txt;..  if( nEq=
20600 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77 73  =0 && (pPlan->ws
20610 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
20620 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
20630 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b  OP_LIMIT))==0 ){
20640 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
20650 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
20660 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30  ccumInit(&txt, 0
20670 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  , 0, SQLITE_MAX_
20680 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64  LENGTH);.  txt.d
20690 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65  b = db;.  sqlite
206a0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
206b0 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a  &txt, " (", 2);.
206c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
206d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c  ; i++){.    expl
206e0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
206f0 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f  xt, i, aCol[aiCo
20700 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20  lumn[i]].zName, 
20710 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d  "=");.  }..  j =
20720 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d   i;.  if( pPlan-
20730 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42  >wsFlags&WHERE_B
20740 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
20750 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
20760 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 61 43 6f  m(&txt, i++, aCo
20770 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  l[aiColumn[j]].z
20780 4e 61 6d 65 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a  Name, ">");.  }.
20790 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46    if( pPlan->wsF
207a0 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
207b0 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c  IMIT ){.    expl
207c0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
207d0 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f  xt, i, aCol[aiCo
207e0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20  lumn[j]].zName, 
207f0 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  "<");.  }.  sqli
20800 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
20810 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b  d(&txt, ")", 1);
20820 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20830 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
20840 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &txt);.}../*.** 
20850 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20860 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
20870 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
20880 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20  sing an EXPLAIN 
20890 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f  QUERY PLAN.** co
208a0 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75  mmand. If the qu
208b0 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c  ery being compil
208c0 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  ed is an EXPLAIN
208d0 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73   QUERY PLAN, a s
208e0 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20  ingle.** record 
208f0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
20900 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
20910 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
20920 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a  n strategy in .*
20930 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  * pLevel..*/.sta
20940 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
20950 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65  OneScan(.  Parse
20960 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
20980 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
20990 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
209a0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
209b0 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74   /* Table list t
209c0 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20  his loop refers 
209d0 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  to */.  WhereLev
209e0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
209f0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
20a00 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c  to write OP_Expl
20a10 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a  ain opcode for *
20a20 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
20a50 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20   "level" column 
20a60 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  of output */.  i
20a70 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a90 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f  * Value for "fro
20aa0 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  m" column of out
20ab0 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  put */.  u16 wct
20ac0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
20ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
20ae0 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  s passed to sqli
20af0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
20b00 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
20b10 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
20b20 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 20  {.    u32 flags 
20b30 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  = pLevel->plan.w
20b40 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72 75  sFlags;.    stru
20b50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20b60 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
20b70 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
20b80 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a  rom];.    Vdbe *
20b90 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20ba0 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65  e;      /* VM be
20bb0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
20bc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  */.    sqlite3 *
20bd0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20be0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
20bf0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63   handle */.    c
20c00 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
20c30 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
20c40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
20c50 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Row;           /
20c60 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
20c70 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
20c80 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20  d by scan */.   
20c90 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73   int iId = pPars
20ca0 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f  e->iSelectId;  /
20cb0 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66  * Select id (lef
20cc0 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f  t-most output co
20cd0 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  lumn) */.    int
20ce0 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20   isSearch;      
20cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20d00 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e  ue for a SEARCH.
20d10 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e   False for SCAN.
20d20 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66 6c   */..    if( (fl
20d30 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f  ags&WHERE_MULTI_
20d40 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61  OR) || (wctrlFla
20d50 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  gs&WHERE_ONETABL
20d60 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e  E_ONLY) ) return
20d70 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20  ;..    isSearch 
20d80 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
20d90 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20 20  nEq>0).         
20da0 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28 57      || (flags&(W
20db0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
20dc0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
20dd0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
20de0 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26   || (wctrlFlags&
20df0 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
20e00 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
20e10 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73  _MAX));..    zMs
20e20 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
20e30 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53  tf(db, "%s", isS
20e40 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22  earch?"SEARCH":"
20e50 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20  SCAN");.    if( 
20e60 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
20e70 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
20e80 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
20e90 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42  b, zMsg, "%s SUB
20ea0 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c  QUERY %d", zMsg,
20eb0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
20ec0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20ed0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
20ee0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
20ef0 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25  Msg, "%s TABLE %
20f00 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
20f10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  >zName);.    }..
20f20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
20f30 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a  Alias ){.      z
20f40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
20f50 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
20f60 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67  "%s AS %s", zMsg
20f70 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
20f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20f90 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  (flags & WHERE_I
20fa0 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
20fb0 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
20fc0 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52   = explainIndexR
20fd0 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c  ange(db, pLevel,
20fe0 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
20ff0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
21000 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
21010 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
21020 25 73 25 73 49 4e 44 45 58 25 73 25 73 25 73 22  %s%sINDEX%s%s%s"
21030 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  , zMsg, .       
21040 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
21050 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22  RE_TEMP_INDEX)?"
21060 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c  AUTOMATIC ":""),
21070 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
21080 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
21090 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22  NLY)?"COVERING "
210a0 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  :""),.          
210b0 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
210c0 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22  TEMP_INDEX)?"":"
210d0 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28   "),.          (
210e0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
210f0 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70  EMP_INDEX)?"": p
21100 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
21110 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  dx->zName),.    
21120 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20 20        zWhere.   
21130 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
21140 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57  te3DbFree(db, zW
21150 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  here);.    }else
21160 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 57 48   if( flags & (WH
21170 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
21180 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
21190 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
211a0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
211b0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
211c0 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
211d0 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b  ARY KEY", zMsg);
211e0 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ..      if( flag
211f0 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  s&WHERE_ROWID_EQ
21200 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
21210 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
21220 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
21230 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73   (rowid=?)", zMs
21240 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
21250 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
21260 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48  _BOTH_LIMIT)==WH
21270 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29  ERE_BOTH_LIMIT )
21280 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
21290 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
212a0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
212b0 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69  rowid>? AND rowi
212c0 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d<?)", zMsg);.  
212d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
212e0 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ags&WHERE_BTM_LI
212f0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
21300 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
21310 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
21320 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20  "%s (rowid>?)", 
21330 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
21340 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45  se if( flags&WHE
21350 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
21360 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
21370 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
21380 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
21390 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid<?)", zMsg);.
213a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
213b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
213c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
213d0 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61     else if( (fla
213e0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
213f0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
21400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
21410 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64  ex_info *pVtabId
21420 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
21430 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20  .u.pVtabIdx;.   
21440 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
21450 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
21460 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20  sg, "%s VIRTUAL 
21470 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
21480 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
21490 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
214a0 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56  bIdx->idxNum, pV
214b0 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b  tabIdx->idxStr);
214c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
214d0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
214e0 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
214f0 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
21500 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20  Y_MAX) ){.      
21510 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
21520 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
21530 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20  ERBY_MIN );.    
21540 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20    nRow = 1;.    
21550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f  }else{.      nRo
21560 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  w = (sqlite3_int
21570 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  64)pLevel->plan.
21580 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nRow;.    }.    
21590 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
215a0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
215b0 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73   "%s (~%lld rows
215c0 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b  )", zMsg, nRow);
215d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
215e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
215f0 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65  lain, iId, iLeve
21600 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20  l, iFrom, zMsg, 
21610 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
21620 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
21630 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  e explainOneScan
21640 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
21650 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
21660 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
21670 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21680 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
21690 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
216a0 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
216b0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
216c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
216d0 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
216e0 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
216f0 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
21700 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
21710 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
21720 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
21730 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
21740 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
21750 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
21760 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
21770 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
21780 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
21790 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77  coded */.  u16 w
217a0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
217b0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
217c0 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
217d0 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
217e0 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  .h */.  Bitmask 
217f0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
21800 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
21810 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
21820 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
21830 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
21840 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21850 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
21860 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21870 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
21880 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
21890 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
218a0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
218b0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
218c0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
218d0 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
218e0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
218f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21900 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
21910 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
21920 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
21930 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
21940 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
21950 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
21960 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
21970 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
21980 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
21990 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  oded */.  WhereC
219a0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
219b0 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
219c0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48  of the entire WH
219d0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
219e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
219f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a00 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  /* A WHERE claus
21a10 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73  e term */.  Pars
21a20 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
21a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21a40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21a50 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
21a80 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
21a90 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
21aa0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21ab0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
21ac0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
21ad0 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
21ae0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
21af0 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
21b00 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
21b10 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
21b20 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
21b30 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
21b60 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
21b70 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
21b80 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
21b90 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
21ba0 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
21bb0 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
21bc0 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
21bd0 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
21be0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
21bf0 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
21c00 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
21c10 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
21c20 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
21c30 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
21c40 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
21c50 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70  pWInfo->pWC;.  p
21c60 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
21c70 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54  >a[iLevel];.  pT
21c80 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
21c90 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
21ca0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
21cb0 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
21cc0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76  >iCursor;.  bRev
21cd0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
21ce0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
21cf0 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20  _REVERSE)!=0;.  
21d00 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
21d10 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
21d20 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
21d30 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
21d40 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
21d50 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
21d60 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a  TABLE)==0;..  /*
21d70 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
21d80 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
21d90 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
21da0 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
21db0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
21dc0 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
21dd0 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
21de0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
21df0 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
21e00 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
21e10 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
21e20 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
21e30 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
21e40 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
21e50 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
21e60 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
21e70 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
21e80 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
21e90 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
21ea0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
21eb0 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
21ec0 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
21ed0 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
21ee0 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
21ef0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
21f00 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
21f10 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
21f20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
21f30 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
21f40 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
21f50 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
21f60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21f70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
21f80 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
21f90 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
21fa0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21fb0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
21fc0 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
21fd0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
21fe0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
21ff0 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
22000 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
22010 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
22020 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
22030 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
22040 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
22050 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
22060 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
22070 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
22080 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
22090 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
220a0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
220b0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
220c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
220d0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
220e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
220f0 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
22100 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
22110 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22120 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
22130 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
22140 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  "));.  }..#ifnde
22150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
22160 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
22170 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e    (pLevel->plan.
22180 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22190 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
221a0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
221b0 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  0:  The table is
221c0 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
221d0 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
221e0 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
221f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
22200 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
22210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
22220 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
22230 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
22240 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
22250 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
22260 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
22270 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
22280 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
22290 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78  raint = pVtabIdx
222a0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
222b0 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
222c0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
222d0 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
222e0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
22320 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
22330 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
22340 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
22350 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74  nstraint *aConst
22360 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20  raint =.        
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
223a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
223b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
223c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
223d0 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
223e0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
223f0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
22400 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72  aint+2);.    for
22410 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72  (j=1; j<=nConstr
22420 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
22430 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f    for(k=0; k<nCo
22440 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a  nstraint; k++){.
22450 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
22460 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
22470 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
22480 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
22490 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
224a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
224b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
224c0 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61  e(pParse, pWC->a
224d0 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70  [iTerm].pExpr->p
224e0 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29  Right, iReg+j+1)
224f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22500 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
22510 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
22520 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
22530 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22550 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22560 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e  , pVtabIdx->idxN
22570 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
22580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22590 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
225a0 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  j-1, iReg+1);.  
225b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
225c0 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
225d0 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  r, iCur, addrBrk
225e0 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64 78  , iReg, pVtabIdx
225f0 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  ->idxStr,.      
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f  pVtabIdx->needTo
22620 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f  FreeIdxStr ? P4_
22630 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
22640 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49  TIC);.    pVtabI
22650 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  dx->needToFreeId
22660 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f  xStr = 0;.    fo
22670 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
22680 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
22690 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
226a0 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
226b0 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
226c0 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d  straint[j].iTerm
226d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
226e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
226f0 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72  el, &pWC->a[iTer
22700 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  m]);.      }.   
22710 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f   }.    pLevel->o
22720 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
22730 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
22740 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
22750 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
22760 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
22770 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
22780 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
22790 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
227a0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73  traint+2);.    s
227b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
227c0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
227d0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
227e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
227f0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
22800 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
22810 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
22820 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
22830 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20   /* Case 1:  We 
22840 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66  can directly ref
22850 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20  erence a single 
22860 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  row using an.   
22870 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
22880 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
22890 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
228a0 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
228b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
228c0 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
228d0 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
228e0 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
228f0 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ".    **        
22900 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
22910 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65   */.    iRelease
22920 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
22930 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
22940 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
22950 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
22960 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
22970 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
22980 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
22990 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
229a0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
229b0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
229c0 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
229d0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
229e0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
229f0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  ble==0 );.    te
22a00 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
22a10 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
22a20 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
22a30 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
22a40 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d  .    iRowidReg =
22a50 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
22a60 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
22a70 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73   pLevel, iReleas
22a80 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e  eReg);.    addrN
22a90 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
22aa0 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rNxt;.    sqlite
22ab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22ac0 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f  P_MustBeInt, iRo
22ad0 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29  widReg, addrNxt)
22ae0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22af0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
22b00 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61  tExists, iCur, a
22b10 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65  ddrNxt, iRowidRe
22b20 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
22b30 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
22b40 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
22b50 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
22b60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22b70 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76  "pk"));.    pLev
22b80 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
22b90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  ;.  }else if( pL
22ba0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22bb0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
22bc0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a  _RANGE ){.    /*
22bd0 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76   Case 2:  We hav
22be0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
22bf0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
22c00 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
22c10 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ld..    */.    i
22c20 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e  nt testOp = OP_N
22c30 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  oop;.    int sta
22c40 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45  rt;.    int memE
22c50 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  ndValue = 0;.   
22c60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
22c70 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
22c80 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
22c90 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61  e==0 );.    pSta
22ca0 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rt = findTerm(pW
22cb0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
22cc0 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
22cd0 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64  GE, 0);.    pEnd
22ce0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
22cf0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
22d00 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
22d10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52  , 0);.    if( bR
22d20 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  ev ){.      pTer
22d30 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
22d40 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
22d50 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54  .      pEnd = pT
22d60 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  erm;.    }.    i
22d70 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
22d80 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
22d90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22da0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
22db0 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72  defines the star
22dc0 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  t bound */.     
22dd0 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20   int r1, rTemp; 
22de0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
22df0 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
22e00 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61  the start bounda
22e10 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ry */..      /* 
22e20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
22e30 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78  nstant maps TK_x
22e40 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72  x codes into cor
22e50 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20  responding .    
22e60 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65    ** seek opcode
22e70 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f  s.  It depends o
22e80 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  n a particular o
22e90 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78  rdering of TK_xx
22ea0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22eb0 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70  const u8 aMoveOp
22ec0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
22ed0 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f    /* TK_GT */  O
22ee0 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20  P_SeekGt,.      
22ef0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f       /* TK_LE */
22f00 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20    OP_SeekLe,.   
22f10 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54          /* TK_LT
22f20 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a   */  OP_SeekLt,.
22f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
22f40 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GE */  OP_SeekG
22f50 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  e.      };.     
22f60 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
22f70 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20  TK_GT+1 );      
22f80 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
22f90 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20   ordering.. */. 
22fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
22fb0 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20  LT==TK_GT+2 );  
22fc0 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74      /*  ... of t
22fd0 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e  he TK_xx values.
22fe0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
22ff0 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54  rt( TK_GE==TK_GT
23000 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +3 );      /*  .
23010 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20  .. is correcct. 
23020 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
23030 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c  se( pStart->wtFl
23040 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
23050 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
23060 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
23070 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d      pX = pStart-
23080 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
23090 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
230a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
230b0 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  art->leftCursor=
230c0 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72  =iCur );.      r
230d0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
230e0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
230f0 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65  pX->pRight, &rTe
23100 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
23110 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
23120 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54  aMoveOp[pX->op-T
23130 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64  K_GT], iCur, add
23140 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20  rBrk, r1);.     
23150 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23160 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73   "pk"));.      s
23170 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
23180 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
23190 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20  arse, r1, 1);.  
231a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
231b0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
231c0 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  , rTemp);.      
231d0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
231e0 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
231f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
23200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23210 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
23220 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
23230 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
23240 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e     }.    if( pEn
23250 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
23260 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  *pX;.      pX = 
23270 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pEnd->pExpr;.   
23280 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
23290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
232a0 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
232b0 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
232c0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64    testcase( pEnd
232d0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
232e0 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
232f0 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
23300 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64   */.      memEnd
23310 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65  Value = ++pParse
23320 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
23330 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
23340 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
23350 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a  , memEndValue);.
23360 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
23370 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
23380 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
23390 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
233a0 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
233b0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
233c0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
233d0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
233e0 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20  OP_Gt;.      }. 
233f0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
23400 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
23410 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20      }.    start 
23420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
23430 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
23440 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
23450 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
23460 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  P_Next;.    pLev
23470 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
23480 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
23490 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70  start;.    if( p
234a0 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64  Start==0 && pEnd
234b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
234c0 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
234d0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
234e0 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d  SCAN_STEP;.    }
234f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23500 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d  rt( pLevel->p5==
23510 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 );.    }.    i
23520 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
23530 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  op ){.      iRow
23540 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
23550 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
23560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
23570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
23590 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77  owid, iCur, iRow
235a0 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
235b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
235c0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
235d0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
235e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
235f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73  dbeAddOp3(v, tes
23600 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  tOp, memEndValue
23610 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69  , addrBrk, iRowi
23620 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
23630 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
23640 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
23650 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
23660 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23670 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
23680 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
23690 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
236a0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
236b0 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20  COLUMN_EQ) ){.  
236c0 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73    /* Case 3: A s
236d0 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
236e0 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
236f0 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
23700 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
23710 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
23720 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
23730 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
23740 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
23750 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
23760 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
23770 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
23780 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
23790 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
237a0 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
237b0 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
237c0 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
237d0 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
237e0 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
237f0 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
23800 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
23810 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
23820 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
23830 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
23840 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
23850 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
23860 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
23870 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
23880 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
23890 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
238a0 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
238b0 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
238c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
238d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
238e0 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
238f0 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
23900 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
23910 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
23920 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
23930 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
23940 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
23950 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
23960 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
23970 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
23980 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
23990 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
239a0 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
239b0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
239c0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
239d0 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
239e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
239f0 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
23a00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23a10 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
23a20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
23a30 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
23a40 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
23a50 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
23a60 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
23a70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
23a80 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
23a90 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
23aa0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
23ab0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23ac0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
23ad0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
23ae0 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
23af0 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
23b00 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
23b10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
23b20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
23b30 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
23b40 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
23b50 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
23b60 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
23b70 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
23b80 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
23b90 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
23ba0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
23bb0 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
23bc0 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
23bd0 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
23be0 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
23bf0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
23c00 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
23c10 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
23c20 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
23c30 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
23c40 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
23c50 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
23c60 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
23c70 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
23c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
23c90 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
23ca0 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
23cb0 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
23cc0 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
23cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
23ce0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
23cf0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
23d00 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
23d10 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
23d20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
23d30 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
23d40 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
23d50 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
23d60 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
23d70 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
23d80 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
23d90 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
23da0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
23db0 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
23dc0 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
23dd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
23de0 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
23df0 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
23e00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
23e10 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
23e20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20      OP_Noop,    
23e30 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
23e40 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  !end_constraints
23e50 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
23e60 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
23e70 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
23e80 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29  raints && !bRev)
23e90 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
23ea0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
23eb0 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
23ec0 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
23ed0 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  /.    };.    int
23ee0 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   nEq = pLevel->p
23ef0 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d  lan.nEq;  /* Num
23f00 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
23f10 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74  terms */.    int
23f20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
23f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
23f40 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  this is an optim
23f50 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28  ized SELECT min(
23f60 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  x).. */.    int 
23f70 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
23f80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
23f90 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
23fa0 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c  g constraint val
23fb0 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ues */.    int r
23fc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
23fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
23fe0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
23ff0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
24000 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20  eStart = 0;  /* 
24010 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
24020 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73  raint at range s
24030 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72  tart */.    Wher
24040 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64  eTerm *pRangeEnd
24050 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71   = 0;    /* Ineq
24060 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
24070 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a  t at range end *
24080 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45  /.    int startE
24090 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
240a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
240b0 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d  nge start uses =
240c0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
240d0 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20     int endEq;   
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
24100 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d   end uses ==, >=
24110 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
24120 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
24130 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
24140 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
24150 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
24160 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
24170 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
24180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
24190 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f  straint terms */
241a0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
241b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241c0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
241d0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
241e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
241f0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
24200 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
24210 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
24220 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
24230 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20  nExtraReg = 0;  
24240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24250 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
24260 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a  sters needed */.
24270 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20   /* Instruction 
242a0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68  opcode */.    ch
242b0 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20  ar *zStartAff;  
242c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
242d0 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74  finity for start
242e0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
242f0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  aint */.    char
24300 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20   *zEndAff;      
24310 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
24320 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20  nity for end of 
24330 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
24340 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20   */..    pIdx = 
24350 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
24360 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72  Idx;.    iIdxCur
24370 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
24380 75 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78  ur;.    k = pIdx
24390 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
243a0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66       /* Column f
243b0 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  or inequality co
243c0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
243d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
243e0 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
243f0 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
24400 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
24410 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73   .    ** was pas
24420 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
24430 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tion to implemen
24440 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  t a "SELECT min(
24450 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20  x) ..." .    ** 
24460 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20  query, then the 
24470 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79  caller will only
24480 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20   allow the loop 
24490 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a  to run for.    *
244a0 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61  * a single itera
244b0 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
244c0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
244d0 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20  row returned.   
244e0 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68   ** should not h
244f0 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ave a NULL value
24500 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20   stored in 'x'. 
24510 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73  If column 'x' is
24520 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73  .    ** the firs
24530 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20  t one after the 
24540 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  nEq equality con
24550 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
24560 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68  index,.    ** th
24570 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65  is requires some
24580 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
24590 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  g..    */.    if
245a0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  ( (wctrlFlags&WH
245b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
245c0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65  !=0.     && (pLe
245d0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
245e0 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
245f0 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e  .     && (pIdx->
24600 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20  nColumn>nEq).   
24610 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   ){.      /* ass
24620 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ert( pOrderBy->n
24630 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  Expr==1 ); */.  
24640 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
24650 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
24660 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
24670 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
24680 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73  ] ); */.      is
24690 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20  MinQuery = 1;.  
246a0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
246b0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
246c0 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61   Find any inequa
246d0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
246e0 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74  terms for the st
246f0 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20  art and end .   
24700 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
24710 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
24720 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24730 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
24740 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
24750 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69    pRangeEnd = fi
24760 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
24770 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28  , k, notReady, (
24780 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49  WO_LT|WO_LE), pI
24790 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  dx);.      nExtr
247a0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
247b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
247c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
247d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
247e0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74  {.      pRangeSt
247f0 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  art = findTerm(p
24800 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
24810 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f  Ready, (WO_GT|WO
24820 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _GE), pIdx);.   
24830 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
24840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
24850 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
24860 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
24870 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
24880 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
24890 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
248a0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
248b0 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
248c0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
248d0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
248e0 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
248f0 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
24900 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
24910 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20  tyTerms(.       
24920 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c   pParse, pLevel,
24930 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20   pWC, notReady, 
24940 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61  nExtraReg, &zSta
24950 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20  rtAff.    );.   
24960 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74   zEndAff = sqlit
24970 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
24980 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66  e->db, zStartAff
24990 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
249a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
249b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ;..    /* If we 
249c0 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65  are doing a reve
249d0 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  rse order scan o
249e0 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  n an ascending i
249f0 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ndex, or.    ** 
24a00 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  a forward order 
24a10 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e  scan on a descen
24a20 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65  ding index, inte
24a30 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20  rchange the .   
24a40 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e   ** start and en
24a50 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53  d terms (pRangeS
24a60 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45  tart and pRangeE
24a70 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nd)..    */.    
24a80 69 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43  if( nEq<pIdx->nC
24a90 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28  olumn && bRev==(
24aa0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
24ab0 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
24ac0 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20 53  _ASC) ){.      S
24ad0 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c  WAP(WhereTerm *,
24ae0 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e   pRangeEnd, pRan
24af0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a  geStart);.    }.
24b00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
24b10 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52  RangeStart && pR
24b20 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
24b30 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
24b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
24b50 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
24b60 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
24b70 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
24b80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
24b90 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
24ba0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
24bb0 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65   WO_LE );.    te
24bc0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
24bd0 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
24be0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
24bf0 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71  E );.    startEq
24c00 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20   = !pRangeStart 
24c10 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  || pRangeStart->
24c20 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
24c30 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65  LE|WO_GE);.    e
24c40 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65  ndEq =   !pRange
24c50 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64  End || pRangeEnd
24c60 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
24c70 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
24c80 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
24c90 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ts = pRangeStart
24ca0 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20   || nEq>0;..    
24cb0 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
24cc0 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
24cd0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
24ce0 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73  ge. */.    nCons
24cf0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
24d00 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
24d10 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
24d20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
24d30 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52  Start->pExpr->pR
24d40 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
24d50 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24d60 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
24d70 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
24d80 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74  if( (pRangeStart
24d90 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
24da0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
24db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24dc0 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
24dd0 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
24de0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
24df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24e00 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b  if( zStartAff ){
24e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
24e20 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
24e30 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61  ity(pRight, zSta
24e40 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  rtAff[nEq])==SQL
24e50 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
24e60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
24e70 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
24e80 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
24e90 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
24ea0 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
24eb0 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
24ec0 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
24ed0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
24ee0 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
24ef0 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
24f00 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
24f10 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
24f20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
24f30 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
24f40 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
24f50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24f60 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
24f70 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
24f80 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
24f90 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
24fa0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d  zStartAff[nEq] =
24fb0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
24fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24fd0 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e    }  .      nCon
24fe0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
24ff0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
25000 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
25010 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
25020 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
25030 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65  -11662 */.    }e
25040 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65  lse if( isMinQue
25050 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
25060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25070 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
25080 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
25090 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
250a0 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20        startEq = 
250b0 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63  0;.      start_c
250c0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a  onstraints = 1;.
250d0 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70      }.    codeAp
250e0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
250f0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
25100 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74  nstraint, zStart
25110 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61  Aff);.    op = a
25120 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
25130 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
25140 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
25150 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72  bRev];.    asser
25160 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20  t( op!=0 );.    
25170 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
25180 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74  _Rewind );.    t
25190 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
251a0 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  Last );.    test
251b0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
251c0 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGt );.    testc
251d0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
251e0 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Ge );.    testca
251f0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
25200 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
25210 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74  e( op==OP_SeekLt
25220 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
25230 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
25240 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
25250 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
25260 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20  Constraint);..  
25270 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
25280 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
25290 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
252a0 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
252b0 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
252c0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
252d0 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
252e0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
252f0 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
25300 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
25310 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
25320 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
25330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25340 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
25350 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31  , regBase+nEq, 1
25360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25370 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25380 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
25390 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28  +nEq);.      if(
253a0 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46   (pRangeEnd->wtF
253b0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
253c0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
253d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
253e0 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
253f0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
25400 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
25410 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
25420 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20  EndAff ){.      
25430 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
25440 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
25450 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
25460 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
25470 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
25480 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
25490 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
254a0 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
254b0 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
254c0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
254d0 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
254e0 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
254f0 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
25500 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
25510 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
25520 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
25530 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66           zEndAff
25540 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
25550 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
25560 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
25570 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
25580 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
25590 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
255a0 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
255b0 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
255c0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
255d0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
255e0 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64     }  .      cod
255f0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
25600 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
25610 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b  nEq+1, zEndAff);
25620 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
25630 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
25640 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d  case( pRangeEnd-
25650 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
25660 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
25670 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
25680 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
25690 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
256a0 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66  e->db, zStartAff
256b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
256c0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
256d0 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20   zEndAff);..    
256e0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
256f0 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70  op body */.    p
25700 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69  Level->p2 = sqli
25710 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25720 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  dr(v);..    /* C
25730 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
25740 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
25750 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
25760 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70  range. */.    op
25770 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67   = aEndOp[(pRang
25780 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28  eEnd || nEq) * (
25790 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20  1 + bRev)];.    
257a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
257b0 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73  _Noop );.    tes
257c0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
257d0 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  xGE );.    testc
257e0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
257f0 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21  T );.    if( op!
25800 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
25810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25820 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
25830 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
25840 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
25850 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  aint);.      sql
25860 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
25870 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20  (v, endEq!=bRev 
25880 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ?1:0);.    }..  
25890 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
258a0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
258b0 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
258c0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
258d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
258e0 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
258f0 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
25900 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
25910 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69  ULL..    ** If i
25920 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68  t is, jump to th
25930 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
25940 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
25950 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71    */.    r1 = sq
25960 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
25970 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73  pParse);.    tes
25980 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
25990 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
259a0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
259b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
259c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
259d0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
259e0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28  LIMIT );.    if(
259f0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
25a00 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
25a10 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
25a20 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29  TOP_LIMIT))!=0 )
25a30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25a40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25a50 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
25a60 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
25a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25a80 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
25a90 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a   r1, addrCont);.
25aa0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25ab0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
25ac0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20  pParse, r1);..  
25ad0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
25ae0 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
25af0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
25b00 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
25b10 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
25b20 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
25b30 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
25b40 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d  nd);.    if( !om
25b50 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
25b60 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
25b70 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
25b80 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
25b90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
25ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25bb0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
25bc0 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67  dxCur, iRowidReg
25bd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25be0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
25bf0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
25c00 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
25c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25c20 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c  dOp2(v, OP_Seek,
25c30 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
25c40 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  );  /* Deferred 
25c50 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  seek */.    }.. 
25c60 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
25c70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
25c80 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
25c90 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
25ca0 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
25cb0 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
25cc0 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
25cd0 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
25ce0 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
25cf0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
25d00 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25d10 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20  UNIQUE ){.      
25d20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
25d30 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
25d40 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
25d50 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
25d60 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  P_Prev;.    }els
25d70 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
25d80 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
25d90 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
25da0 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
25db0 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
25dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
25dd0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
25de0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
25df0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
25e00 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
25e10 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f  * Case 4:  Two o
25e20 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
25e30 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
25e40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
25e50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
25e60 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
25e70 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
25e80 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
25e90 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
25ea0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
25eb0 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
25ec0 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
25ed0 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
25ee0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
25ef0 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
25f00 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
25f10 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
25f20 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
25f30 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
25f40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
25f50 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
25f60 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
25f70 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
25f80 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
25f90 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
25fa0 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
25fb0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
25fc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
25fd0 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
25fe0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
25ff0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
26000 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
26010 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
26020 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
26030 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
26040 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
26050 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
26060 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
26070 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
26080 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
26090 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
260a0 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
260b0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
260c0 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
260d0 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
260e0 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
260f0 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
26100 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
26110 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
26120 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
26130 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
26140 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
26150 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
26160 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
26170 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
26180 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
26190 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
261a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
261b0 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
261c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
261d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
261e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
261f0 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
26200 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
26210 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
26220 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
26230 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
26240 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
26250 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
26260 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
26270 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
26280 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
26290 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
262b0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
262c0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
262d0 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
262e0 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
262f0 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
26300 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
26310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
26320 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
26350 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
26360 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
26370 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
26390 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
263a0 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
263b0 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
263c0 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
263d0 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
263e0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
263f0 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
26400 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
26410 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
26420 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
26430 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
26440 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
26450 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
26460 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
26470 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65  /..    int regRe
26480 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
26490 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
264a0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65   /* Register use
264b0 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20  d with OP_Gosub 
264c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
264d0 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  wset = 0;       
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
26500 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a   RowSet object *
26510 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
26520 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
26550 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  ing rowid */.   
26560 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d   int iLoopBody =
26570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
26580 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74  Label(v);  /* St
26590 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79  art of loop body
265a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74   */.    int iRet
265b0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
265e0 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a  regReturn init *
265f0 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74  /.    int untest
26600 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20  edTerms = 0;    
26610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65           /* Some
26620 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c   terms not compl
26630 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a  etely tested */.
26640 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a      int ii;.   .
26650 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76      pTerm = pLev
26660 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  el->plan.u.pTerm
26670 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
26680 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
26690 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
266a0 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b  erator==WO_OR );
266b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
266c0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
266d0 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
266e0 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
266f0 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
26700 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
26710 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
26720 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
26730 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
26740 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
26750 77 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72  w SrcList ni pOr
26760 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
26770 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
26780 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
26790 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
267a0 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
267b0 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
267c0 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
267d0 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
267e0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
267f0 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
26800 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
26810 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
26820 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
26830 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
26840 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
26850 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
26860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26870 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
26880 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
26890 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
268a0 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
268b0 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
268c0 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
268d0 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
268e0 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
268f0 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
26900 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
26910 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
26920 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
26930 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
26960 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
26970 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
26980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
26990 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
269a0 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
269b0 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
269c0 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20  (i16)(nNotReady 
269d0 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54  + 1);.      pOrT
269e0 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61  ab->nSrc = pOrTa
269f0 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20  b->nAlloc;.     
26a00 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e   memcpy(pOrTab->
26a10 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a  a, pTabItem, siz
26a20 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b  eof(*pTabItem));
26a30 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d  .      origSrc =
26a40 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
26a50 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  t->a;.      for(
26a60 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64  k=1; k<=nNotRead
26a70 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
26a80 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d   memcpy(&pOrTab-
26a90 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b  >a[k], &origSrc[
26aa0 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d  pLevel[k].iFrom]
26ab0 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  , sizeof(pOrTab-
26ac0 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d  >a[k]));.      }
26ad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26ae0 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66    pOrTab = pWInf
26af0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20  o->pTabList;.   
26b00 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   }..    /* Initi
26b10 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74  alize the rowset
26b20 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
26b30 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51  tain NULL. An SQ
26b40 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a  L NULL is .    *
26b50 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
26b60 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e  an empty rowset.
26b70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
26b80 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  lso initialize r
26b90 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74  egReturn to cont
26ba0 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  ain the address 
26bb0 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
26bc0 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64  on .    ** immed
26bd0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
26be0 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61   the OP_Return a
26bf0 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
26c00 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20  the loop. This. 
26c10 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
26c20 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75  d in a few obscu
26c30 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73  re LEFT JOIN cas
26c40 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c  es where control
26c50 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76   jumps.    ** ov
26c60 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  er the top of th
26c70 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20  e loop into the 
26c80 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74  body of it. In t
26c90 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20  his case the .  
26ca0 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73    ** correct res
26cb0 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e  ponse for the en
26cc0 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28  d-of-loop code (
26cd0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69  the OP_Return) i
26ce0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c  s to .    ** fal
26cf0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
26d00 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
26d10 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50  n, just as an OP
26d20 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20  _Next does if.  
26d30 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61    ** called on a
26d40 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
26d50 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
26d60 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
26d70 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
26d80 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
26d90 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
26da0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
26db0 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
26dc0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
26dd0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
26de0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26df0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
26e00 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
26e10 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
26e20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26e30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
26e40 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
26e50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
26e60 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
26e70 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
26e80 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
26e90 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
26ea0 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
26eb0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
26ec0 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  || pOrTerm->eOpe
26ed0 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
26ee0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e  .        WhereIn
26ef0 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20  fo *pSubWInfo;  
26f00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
26f10 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
26f20 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
26f30 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
26f40 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
26f50 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
26f60 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
26f70 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
26f80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
26f90 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
26fa0 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  b, pOrTerm->pExp
26fb0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
26fd0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20  ERE_OMIT_OPEN | 
26fe0 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45  WHERE_OMIT_CLOSE
26ff0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
27000 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
27010 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57  _FORCE_TABLE | W
27020 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
27030 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  LY);.        if(
27040 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
27050 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 4f          explainO
27060 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20  neScan(.        
27070 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4f        pParse, pO
27080 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66 6f  rTab, &pSubWInfo
27090 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20  ->a[0], iLevel, 
270a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30  pLevel->iFrom, 0
270b0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
270c0 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
270d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
270e0 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
270f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27100 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
27110 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
27120 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
27130 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
27140 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
27150 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
27160 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
27170 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
27180 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20    regRowid);.   
271c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
271d0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
271e0 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
271f0 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20  regRowset,.     
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27220 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
27230 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53 65 74  dr(v)+2, r, iSet
27240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27250 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27260 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27270 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72  _Gosub, regRetur
27280 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  n, iLoopBody);..
27290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
272a0 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
272b0 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d  stedTerms flag m
272c0 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f  eans that this O
272d0 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20  R term.         
272e0 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e   ** contained on
272f0 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65  e or more AND te
27300 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61  rm from a notRea
27310 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20  dy table.  The. 
27320 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d           ** term
27330 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65  s from the notRe
27340 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20  ady table could 
27350 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e  not be tested an
27360 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  d will.         
27370 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74   ** need to be t
27380 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20  ested later..   
27390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
273a0 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
273b0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
273c0 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73   ) untestedTerms
273d0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
273e0 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
273f0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
27400 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
27410 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
27420 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
27430 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27440 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
27450 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27460 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
27470 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69  dbeChangeP1(v, i
27480 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33  RetInit, sqlite3
27490 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
274a0 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
274b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
274c0 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
274d0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
274e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
274f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70  veLabel(v, iLoop
27500 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20  Body);..    if( 
27510 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
27520 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46   ) sqlite3StackF
27530 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
27540 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28  pOrTab);.    if(
27550 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20   !untestedTerms 
27560 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c  ) disableTerm(pL
27570 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
27580 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
27590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
275a0 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
275b0 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20    {.    /* Case 
275c0 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  5:  There is no 
275d0 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
275e0 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
275f0 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lete.    **     
27600 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
27610 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
27620 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
27630 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b   const u8 aStep[
27640 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f  ] = { OP_Next, O
27650 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74  P_Prev };.    st
27660 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
27670 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65  tart[] = { OP_Re
27680 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b  wind, OP_Last };
27690 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65  .    assert( bRe
276a0 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20  v==0 || bRev==1 
276b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
276c0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
276d0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
276e0 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
276f0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
27700 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
27710 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
27720 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
27730 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
27740 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
27750 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
27760 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
27770 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
27780 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20  }.  notReady &= 
27790 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d  ~getMask(pWC->pM
277a0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a  askSet, iCur);..
277b0 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
277c0 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73   to test every s
277d0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
277e0 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74  t can be complet
277f0 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65  ely.  ** compute
27800 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
27810 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
27820 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50  s..  **.  ** IMP
27830 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
27840 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54 65  R-49525-50935 Te
27850 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  rms that cannot 
27860 62 65 20 73 61 74 69 73 66 69 65 64 20 74 68 72  be satisfied thr
27870 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75 73  ough.  ** the us
27880 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65 63  e of indices bec
27890 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74 20 61  ome tests that a
278a0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  re evaluated aga
278b0 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f 66  inst each row of
278c0 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76 61  .  ** the releva
278d0 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73 2e  nt input tables.
278e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
278f0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
27900 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
27910 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
27920 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
27930 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
27940 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
27950 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a  RTUAL ); /* IMP:
27960 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27970 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
27980 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
27990 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
279a0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
279b0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
279c0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
279d0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
279e0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
279f0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
27a00 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
27a10 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
27a20 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
27a30 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27a40 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
27a50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27a60 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
27a70 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
27a80 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
27a90 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
27aa0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
27ab0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
27ac0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
27ad0 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
27ae0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
27af0 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
27b00 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
27b10 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
27b20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
27b30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27b40 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27b50 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
27b60 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
27b70 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
27b80 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
27b90 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ED;.  }..  /* Fo
27ba0 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
27bb0 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
27bc0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
27bd0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
27be0 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
27bf0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
27c00 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
27c10 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
27c20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
27c30 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
27c40 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
27c50 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
27c60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
27c70 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
27c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27c90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
27ca0 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
27cb0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
27cc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
27cd0 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
27ce0 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
27cf0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27d00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
27d10 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
27d20 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
27d30 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
27d40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27d50 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
27d60 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
27d70 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ;  /* IMP: R-305
27d80 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
27d90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27da0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27db0 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
27dc0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
27dd0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
27de0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
27df0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27e00 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
27e10 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
27e20 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
27e30 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
27e40 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
27e50 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
27e60 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
27e70 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
27e80 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
27e90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27ea0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
27eb0 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
27ec0 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
27ed0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
27ee0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
27ef0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
27f00 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
27f10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
27f20 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
27f30 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f  g);..  return no
27f40 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64  tReady;.}..#if d
27f50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
27f60 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ST)./*.** The fo
27f70 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
27f80 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65   holds a text de
27f90 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65  scription of que
27fa0 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65  ry plan generate
27fb0 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74  d.** by the most
27fc0 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
27fd0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27fe0 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  n().  Each call 
27ff0 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a  to WhereBegin.**
28000 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
28010 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20  previous.  This 
28020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
28030 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
28040 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  and.** analysis 
28050 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  only..*/.char sq
28060 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
28070 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20  [BMS*2*40];  /* 
28080 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  Text of the join
28090 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
280a0 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20  QPlan = 0;      
280b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
280c0 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75  free slow in _qu
280d0 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23  ery_plan[] */..#
280e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
280f0 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
28100 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
28110 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
28120 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
28130 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
28140 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
28150 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
28160 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
28170 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
28180 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
28190 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
281a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
281b0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
281c0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
281d0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
281e0 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
281f0 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
28200 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
28210 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62  eIdxStr==0 || db
28220 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28230 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ; */.        if(
28240 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
28250 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
28260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28270 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
28280 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28290 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
282a0 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20  ee(db, pInfo);. 
282b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
282c0 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
282d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
282e0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b  RE_TEMP_INDEX ){
282f0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
28300 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  pIdx = pWInfo->a
28310 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  [i].plan.u.pIdx;
28320 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
28330 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  x ){.          s
28340 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
28350 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b   pIdx->zColAff);
28360 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28370 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
28380 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
28390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
283a0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
283b0 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
283c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
283d0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
283e0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
283f0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
28400 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
28410 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
28420 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
28430 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
28440 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
28450 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
28460 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
28470 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
28480 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
28490 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
284a0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
284b0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
284c0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
284d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
284e0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
284f0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
28500 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
28510 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
28520 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
28530 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
28540 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
28550 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
28560 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
28570 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
28580 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
28590 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
285a0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
285b0 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
285c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
285d0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
285e0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
285f0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
28600 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
28610 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
28620 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
28630 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
28640 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
28650 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
28660 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
28670 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
28680 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
28690 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
286a0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
286b0 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
286c0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
286d0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
286e0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
286f0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
28700 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
28710 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
28720 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
28730 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
28740 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
28750 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
28760 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
28770 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
28780 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
28790 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
287c0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
287d0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
287e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
287f0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
28800 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
28830 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
28840 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
28850 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
28860 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
28870 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
28880 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
28890 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
288a0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
288b0 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
288c0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
288d0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
288e0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
288f0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
28900 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
28910 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
28920 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
28930 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
28940 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
28950 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
28960 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
28970 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
28980 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
28990 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
289a0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
289b0 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
289c0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
289d0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
289e0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
289f0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
28a00 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
28a10 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
28a20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
28a30 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
28a40 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
28a50 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
28a60 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
28a70 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
28a80 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
28a90 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
28aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
28ab0 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
28ac0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
28ad0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
28ae0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
28af0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
28b00 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
28b10 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
28b20 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
28b30 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
28b40 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
28b50 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
28b60 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
28b70 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
28b80 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
28b90 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
28ba0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
28bb0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
28bc0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
28bd0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
28be0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
28bf0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
28c00 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
28c10 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
28c20 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
28c30 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
28c40 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
28c50 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
28c60 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
28c70 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
28c80 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
28c90 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
28ca0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
28cb0 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
28cc0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
28cd0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
28ce0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
28cf0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
28d00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
28d10 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
28d20 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
28d30 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
28d40 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
28d50 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
28d60 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
28d70 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
28d80 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
28d90 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
28da0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
28db0 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
28dc0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
28dd0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
28de0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
28df0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
28e00 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
28e10 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
28e20 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
28e30 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
28e40 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
28e50 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
28e60 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
28e70 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
28e80 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
28e90 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
28ea0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
28eb0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
28ec0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
28ed0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
28ee0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
28ef0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
28f00 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
28f10 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
28f20 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
28f30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
28f40 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
28f50 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
28f60 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
28f70 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
28f80 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
28f90 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
28fa0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
28fb0 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
28fc0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
28fd0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
28fe0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
28ff0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
29000 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
29010 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
29020 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
29030 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
29040 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
29050 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
29060 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
29070 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
29080 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
29090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
290a0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
290b0 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
290c0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
290d0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
290e0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
290f0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
29100 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
29110 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
29120 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
29130 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
29140 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
29150 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
29160 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
29170 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
29180 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
29190 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
291a0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
291b0 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
291c0 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
291d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
291e0 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
291f0 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
29200 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
29210 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
29220 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
29230 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
29240 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
29250 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
29260 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
29270 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
29280 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
29290 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
292a0 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
292b0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
292c0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
292d0 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
292e0 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
292f0 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
29300 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29310 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29320 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
29330 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
29340 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
29350 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
29360 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
29370 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
29380 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
29390 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
293a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
293b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
293c0 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
293d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
293e0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  , or NULL */.  u
293f0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
29400 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
29410 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
29420 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
29430 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20  teInt.h */.){.  
29440 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
29450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
29460 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
29470 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
29480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29490 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
294a0 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
294b0 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
294c0 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
294d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
294e0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
294f0 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
29500 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
29510 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
29520 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
29530 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
29540 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
29550 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
29560 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
29570 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
29580 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
29590 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
295a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
295b0 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
295c0 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
295d0 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
295e0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
295f0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
29600 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
29610 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
29620 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
29630 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
29640 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  n of the WHERE c
29650 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
29660 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29670 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
29680 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
29690 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
296a0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
296b0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
296c0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
296d0 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
296e0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
296f0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
29700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
29710 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
29720 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
29730 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29750 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
29760 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e  ion of all pWC->
29770 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20  a[].wtFlags */. 
29780 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
29790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
297a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
297b0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  on */..  /* The 
297c0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
297d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
297e0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
297f0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
29800 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
29810 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
29820 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
29830 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
29840 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
29850 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
29860 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
29870 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
29880 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
29890 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
298a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
298b0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
298c0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
298d0 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
298e0 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
298f0 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
29900 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
29910 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
29920 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
29930 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
29940 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
29950 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
29960 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
29970 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
29980 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
29990 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
299a0 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
299b0 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
299c0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
299d0 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
299e0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
299f0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
29a00 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
29a10 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
29a20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
29a30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
29a40 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
29a50 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
29a60 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
29a70 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
29a80 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
29a90 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
29aa0 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
29ab0 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
29ac0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
29ad0 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
29ae0 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
29af0 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
29b00 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
29b10 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
29b20 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
29b30 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
29b40 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
29b50 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
29b60 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
29b70 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
29b80 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
29b90 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
29ba0 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
29bb0 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  low..  */.  db =
29bc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
29bd0 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
29be0 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
29bf0 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
29c00 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
29c10 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
29c20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
29c30 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
29c40 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20   nByteWInfo + . 
29c50 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
29c60 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20  eClause) +.     
29c70 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
29c80 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28  kSet).  );.  if(
29c90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29ca0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
29cb0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
29cc0 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
29cd0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
29ce0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
29cf0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
29d00 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
29d10 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
29d20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
29d30 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
29d40 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
29d50 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
29d60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29d70 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  (v);.  pWInfo->p
29d80 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72  WC = pWC = (Wher
29d90 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20  eClause *)&((u8 
29da0 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57  *)pWInfo)[nByteW
29db0 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d  Info];.  pWInfo-
29dc0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
29dd0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
29de0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
29df0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
29e00 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
29e10 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73  kSet = (WhereMas
29e20 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a  kSet*)&pWC[1];..
29e30 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
29e40 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
29e50 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
29e60 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
29e70 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
29e80 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
29e90 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
29ea0 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
29eb0 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
29ec0 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
29ed0 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61  useInit(pWC, pPa
29ee0 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
29ef0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29f00 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
29f10 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
29f20 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57  ereSplit(pWC, pW
29f30 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20  here, TK_AND);  
29f40 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32   /* IMP: R-15842
29f50 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20  -53296 */.    . 
29f60 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
29f70 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
29f80 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
29f90 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
29fa0 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
29fb0 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
29fc0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
29fd0 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
29fe0 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
29ff0 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69  Where && (nTabLi
2a000 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
2a010 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
2a020 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
2a030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2a040 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2a050 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
2a060 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  >iBreak, SQLITE_
2a070 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2a080 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
2a090 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
2a0a0 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
2a0b0 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
2a0c0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
2a0d0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
2a0e0 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
2a0f0 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
2a100 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
2a110 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
2a120 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
2a130 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
2a140 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
2a150 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
2a160 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
2a170 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2a180 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
2a190 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
2a1a0 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
2a1b0 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
2a1c0 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
2a1d0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
2a1e0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
2a1f0 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
2a200 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
2a210 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
2a220 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
2a230 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
2a240 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
2a250 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
2a260 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
2a270 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2a280 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
2a290 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
2a2a0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
2a2b0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
2a2c0 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
2a2d0 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
2a2e0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2a2f0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
2a300 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
2a310 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
2a320 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
2a330 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57 68  Configure the Wh
2a340 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20  ereClause.vmask 
2a350 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74  variable so that
2a360 20 62 69 74 73 20 74 68 61 74 20 63 6f 72 72 65   bits that corre
2a370 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69  spond.  ** to vi
2a380 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
2a390 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  ors are set. Thi
2a3a0 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c  s is used to sel
2a3b0 65 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65  ectively disable
2a3c0 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f   .  ** the OR-to
2a3d0 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  -IN transformati
2a3e0 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a  on in exprAnalyz
2a3f0 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73  eOrTerm(). It is
2a400 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20   not helpful .  
2a410 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  ** with virtual 
2a420 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2a430 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
2a440 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
2a450 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
2a460 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
2a470 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
2a480 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
2a490 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
2a4a0 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
2a4b0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
2a4c0 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
2a4d0 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
2a4e0 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
2a4f0 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
2a500 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
2a510 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
2a520 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a530 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26  pWC->vmask==0 &&
2a540 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20   pMaskSet->n==0 
2a550 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2a560 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2a570 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
2a580 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2a590 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
2a5a0 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20  ursor);.#ifndef 
2a5b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a5c0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
2a5d0 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74   ALWAYS(pTabList
2a5e0 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20  ->a[i].pTab) && 
2a5f0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69  IsVirtual(pTabLi
2a600 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29  st->a[i].pTab) )
2a610 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61  {.      pWC->vma
2a620 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  sk |= ((Bitmask)
2a630 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  1 << i);.    }.#
2a640 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65  endif.  }.#ifnde
2a650 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
2a660 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
2a670 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
2a680 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
2a690 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2a6a0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
2a6b0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
2a6c0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2a6d0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2a6e0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
2a6f0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
2a700 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
2a710 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2a720 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
2a730 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
2a740 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
2a750 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
2a760 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
2a770 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
2a780 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
2a790 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2a7a0 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
2a7b0 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
2a7c0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
2a7d0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
2a7e0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
2a7f0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
2a800 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
2a810 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
2a820 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
2a830 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
2a840 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
2a850 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
2a860 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66  List, pWC);.  if
2a870 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2a880 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
2a890 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2a8a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
2a8b0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
2a8c0 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
2a8d0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
2a8e0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2a8f0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
2a900 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
2a910 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
2a920 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2a930 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
2a940 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
2a950 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
2a960 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
2a970 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73    pWInfo->a[].ws
2a980 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78  Flags   WHERE_xx
2a990 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
2a9a0 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
2a9b0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2a9c0 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
2a9d0 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
2a9e0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
2a9f0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2aa00 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68  .iFrom     Which
2aa10 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
2aa20 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
2aa30 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
2aa40 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
2aa50 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
2aa60 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
2aa70 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
2aa80 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
2aa90 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
2aaa0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
2aab0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57   index.  **   pW
2aac0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20  Info->a[].pTerm 
2aad0 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73      When wsFlags
2aae0 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d  ==WO_OR, the OR-
2aaf0 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a  clause term.  **
2ab00 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2ab10 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
2ab20 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
2ab30 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2ab40 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
2ab50 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
2ab60 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
2ab70 6b 29 30 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  k)0;.  andFlags 
2ab80 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
2ab90 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2aba0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
2abb0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
2abc0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2abd0 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74  o->a; i<nTabList
2abe0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
2abf0 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20  {.    WhereCost 
2ac00 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20  bestPlan;       
2ac10 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69    /* Most effici
2ac20 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f  ent plan seen so
2ac30 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65   far */.    Inde
2ac40 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
2ac50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ac60 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
2ac70 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
2ac80 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aca0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2acb0 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
2acc0 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20  /.    int bestJ 
2acd0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2ace0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
2acf0 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  f j */.    Bitma
2ad00 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20  sk m;           
2ad10 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
2ad20 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72  k value for j or
2ad30 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e   bestJ */.    in
2ad40 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20  t isOptimal;    
2ad50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2ad60 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61  rator for optima
2ad70 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65  l/non-optimal se
2ad80 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  arch */.    int 
2ad90 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20  nUnconstrained; 
2ada0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2adb0 72 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74  r tables without
2adc0 20 49 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a 20   INDEXED BY */. 
2add0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e     Bitmask notIn
2ade0 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 2f  dexed;         /
2adf0 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
2ae00 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65   that cannot use
2ae10 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   an index */..  
2ae20 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c    memset(&bestPl
2ae30 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65  an, 0, sizeof(be
2ae40 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65  stPlan));.    be
2ae50 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53  stPlan.rCost = S
2ae60 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20  QLITE_BIG_DBL;. 
2ae70 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
2ae80 2a 2a 2a 20 42 65 67 69 6e 20 73 65 61 72 63 68  *** Begin search
2ae90 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a   for loop %d ***
2aea0 5c 6e 22 2c 20 69 29 29 3b 0a 0a 20 20 20 20 2f  \n", i));..    /
2aeb0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
2aec0 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74  he remaining ent
2aed0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2aee0 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20   clause to find 
2aef0 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
2af00 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65  nested loop. The
2af10 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20   loop tests all 
2af20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2af30 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65  ies.    ** eithe
2af40 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e  r once or twice.
2af50 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2af60 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20 69  The first test i
2af70 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d  s always perform
2af80 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ed if there are 
2af90 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72  two or more entr
2afa0 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69  ies.    ** remai
2afb0 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70  ning and never p
2afc0 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72  erformed if ther
2afd0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52  e is only one FR
2afe0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a  OM clause entry.
2aff0 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65      ** to choose
2b000 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73   from.  The firs
2b010 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72  t test looks for
2b020 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63   an "optimal" sc
2b030 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74  an.  In.    ** t
2b040 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f  his context an o
2b050 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f  ptimal scan is o
2b060 6e 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  ne that uses the
2b070 20 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20   same strategy. 
2b080 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69     ** for the gi
2b090 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ven FROM clause 
2b0a0 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62  entry as would b
2b0b0 65 20 73 65 6c 65 63 74 65 64 20 69 66 20 74 68  e selected if th
2b0c0 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77  e entry.    ** w
2b0d0 65 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20  ere used as the 
2b0e0 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64  innermost nested
2b0f0 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72   loop.  In other
2b100 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a   words, a table.
2b110 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e      ** is chosen
2b120 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 63   such that the c
2b130 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74  ost of running t
2b140 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  hat table cannot
2b150 20 62 65 20 72 65 64 75 63 65 64 0a 20 20 20 20   be reduced.    
2b160 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f  ** by waiting fo
2b170 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74  r other tables t
2b180 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68  o run first.  Th
2b190 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73  is "optimal" tes
2b1a0 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62  t works.    ** b
2b1b0 79 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67  y first assuming
2b1c0 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63   that the FROM c
2b1d0 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20  lause is on the 
2b1e0 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66  inner loop and f
2b1f0 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74  inding.    ** it
2b200 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68  s query plan, th
2b210 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  en checking to s
2b220 65 65 20 69 66 20 74 68 61 74 20 71 75 65 72 79  ee if that query
2b230 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20   plan uses any. 
2b240 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d     ** other FROM
2b250 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
2b260 61 74 20 61 72 65 20 6e 6f 74 52 65 61 64 79 2e  at are notReady.
2b270 20 20 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79    If no notReady
2b280 20 74 65 72 6d 73 20 61 72 65 0a 20 20 20 20 2a   terms are.    *
2b290 2a 20 75 73 65 64 20 74 68 65 6e 20 74 68 65 20  * used then the 
2b2a0 22 6f 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20  "optimal" query 
2b2b0 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20  plan works..    
2b2c0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2b2d0 68 61 74 20 74 68 65 20 57 68 65 72 65 43 6f 73  hat the WhereCos
2b2e0 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72  t.nRow parameter
2b2f0 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20   for an optimal 
2b300 73 63 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a  scan might.    *
2b310 2a 20 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c  * not be as smal
2b320 6c 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65  l as it would be
2b330 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 72 65   if the table re
2b340 61 6c 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e  ally were the in
2b350 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a  nermost.    ** j
2b360 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  oin.  The nRow v
2b370 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 64 75  alue can be redu
2b380 63 65 64 20 62 79 20 57 48 45 52 45 20 63 6c 61  ced by WHERE cla
2b390 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
2b3a0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e      ** that do n
2b3b0 6f 74 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20  ot use indices. 
2b3c0 20 42 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72   But this nRow r
2b3d0 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61  eduction only ha
2b3e0 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20  ppens if the.   
2b3f0 20 2a 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79   ** table really
2b400 20 69 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73   is the innermos
2b410 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a  t join.  .    **
2b420 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
2b430 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f  nd loop iteratio
2b440 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72  n is only perfor
2b450 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61  med if no optima
2b460 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74  l scan.    ** st
2b470 72 61 74 65 67 69 65 73 20 77 65 72 65 20 66 6f  rategies were fo
2b480 75 6e 64 20 62 79 20 74 68 65 20 66 69 72 73 74  und by the first
2b490 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
2b4a0 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
2b4b0 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64  n.    ** is used
2b4c0 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
2b4d0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73  he lowest cost s
2b4e0 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20  can overall..   
2b4f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76 69   **.    ** Previ
2b500 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ous versions of 
2b510 53 51 4c 69 74 65 20 70 65 72 66 6f 72 6d 65 64  SQLite performed
2b520 20 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e 64   only the second
2b530 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20   iteration -.   
2b540 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f 75 74   ** the next out
2b550 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20  ermost loop was 
2b560 61 6c 77 61 79 73 20 74 68 61 74 20 77 69 74 68  always that with
2b570 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 76 65 72   the lowest over
2b580 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e  all.    ** cost.
2b590 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d   However, this m
2b5a0 65 61 6e 74 20 74 68 61 74 20 53 51 4c 69 74 65  eant that SQLite
2b5b0 20 63 6f 75 6c 64 20 73 65 6c 65 63 74 20 74 68   could select th
2b5c0 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20  e wrong plan.   
2b5d0 20 2a 2a 20 66 6f 72 20 73 63 72 69 70 74 73 20   ** for scripts 
2b5e0 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c  such as the foll
2b5f0 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20  owing:.    **   
2b600 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
2b610 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
2b620 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54   .    **   CREAT
2b630 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29  E TABLE t2(c, d)
2b640 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  ;.    **   SELEC
2b650 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20  T * FROM t2, t1 
2b660 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d  WHERE t2.rowid =
2b670 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20   t1.a;.    **.  
2b680 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74    ** The best st
2b690 72 61 74 65 67 79 20 69 73 20 74 6f 20 69 74 65  rategy is to ite
2b6a0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61 62  rate through tab
2b6b0 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77  le t1 first. How
2b6c0 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69  ever it.    ** i
2b6d0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2b6e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  o determine this
2b6f0 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67   with a simple g
2b700 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e  reedy algorithm.
2b710 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  .    ** Since th
2b720 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
2b730 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
2b740 74 61 62 6c 65 20 74 32 20 69 73 20 74 68 65 20  table t2 is the 
2b750 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20  same .    ** as 
2b760 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
2b770 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2b780 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69  h table t1, a si
2b790 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20  mple greedy .   
2b7a0 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61   ** algorithm ma
2b7b0 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20  y choose to use 
2b7c0 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72  t2 for the outer
2b7d0 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20   loop, which is 
2b7e0 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f  a much.    ** co
2b7f0 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e  stlier approach.
2b800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63  .    */.    nUnc
2b810 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a  onstrained = 0;.
2b820 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d      notIndexed =
2b830 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f 70   0;.    for(isOp
2b840 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61  timal=(iFrom<nTa
2b850 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70 74 69  bList-1); isOpti
2b860 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c  mal>=0 && bestJ<
2b870 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b  0; isOptimal--){
2b880 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2b890 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2b8a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c   /* Mask of tabl
2b8b0 65 73 20 6e 6f 74 20 79 65 74 20 72 65 61 64 79  es not yet ready
2b8c0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
2b8d0 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d  iFrom, pTabItem=
2b8e0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
2b8f0 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b   j<nTabList; j++
2b900 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20  , pTabItem++){. 
2b910 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74         int doNot
2b920 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54  Reorder;    /* T
2b930 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
2b940 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2b950 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
2b960 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
2b970 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73  Cost;     /* Cos
2b980 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  t information fr
2b990 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d  om best[Virtual]
2b9a0 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20  Index() */.     
2b9b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
2b9c0 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52  derBy;  /* ORDER
2b9d0 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69   BY clause for i
2b9e0 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65  ndex to optimize
2b9f0 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64   */.  .        d
2ba00 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28  oNotReorder =  (
2ba10 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pTabItem->jointy
2ba20 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
2ba30 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
2ba40 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
2ba50 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
2ba60 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2ba70 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
2ba80 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
2ba90 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2baa0 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
2bab0 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
2bac0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
2bad0 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
2bae0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2baf0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2bb00 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 28 69 73        mask = (is
2bb10 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f  Optimal ? m : no
2bb20 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 20  tReady);.       
2bb30 20 70 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d   pOrderBy = ((i=
2bb40 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
2bb50 29 3f 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b  )?*ppOrderBy:0);
2bb60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
2bb70 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30  bItem->pIndex==0
2bb80 20 29 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65   ) nUnconstraine
2bb90 64 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  d++;.  .        
2bba0 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d  WHERETRACE(("===
2bbb0 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64   trying table %d
2bbc0 20 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d   with isOptimal=
2bbd0 25 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20  %d ===\n",.     
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
2bbf0 2c 20 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20  , isOptimal));. 
2bc00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2bc10 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b  TabItem->pTab );
2bc20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2bc40 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
2bc50 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
2bc60 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2bc70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
2bc80 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26  ex_info **pp = &
2bc90 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64  pWInfo->a[j].pId
2bca0 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  xInfo;.         
2bcb0 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
2bcc0 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
2bcd0 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e  TabItem, mask, n
2bce0 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42  otReady, pOrderB
2bcf0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2bd10 43 6f 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20  Cost, pp);.     
2bd20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66     }else .#endif
2bd30 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2bd40 20 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e       bestBtreeIn
2bd50 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
2bd60 20 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c   pTabItem, mask,
2bd70 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65   notReady, pOrde
2bd80 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2bda0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
2bdb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bdc0 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28 73   isOptimal || (s
2bdd0 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61  Cost.used&notRea
2bde0 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  dy)==0 );..     
2bdf0 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45     /* If an INDE
2be00 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73  XED BY clause is
2be10 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
2be20 68 65 20 70 6c 61 6e 20 6d 75 73 74 20 75 73 65  he plan must use
2be30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2be40 20 69 6e 64 65 78 20 69 66 20 69 74 20 75 73 65   index if it use
2be50 73 20 61 6e 79 20 69 6e 64 65 78 20 61 74 20 61  s any index at a
2be60 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ll */.        as
2be70 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
2be80 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2bea0 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2beb0 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2bec0 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20  FULLSCAN)==0.   
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2bee0 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e 70  | sCost.plan.u.p
2bef0 49 64 78 3d 3d 70 54 61 62 49 74 65 6d 2d 3e 70  Idx==pTabItem->p
2bf00 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20 20 20  Index );..      
2bf10 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c 20    if( isOptimal 
2bf20 26 26 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77  && (sCost.plan.w
2bf30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
2bf40 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
2bf50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 74  ){.          not
2bf60 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20 20  Indexed |= m;.  
2bf70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2bf80 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75   /* Conditions u
2bf90 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73 20  nder which this 
2bfa0 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74 68  table becomes th
2bfb0 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a 20  e best so far:. 
2bfc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2bfd0 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 74    **   (1) The t
2bfe0 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64 65  able must not de
2bff0 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74 61  pend on other ta
2c000 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  bles that have n
2c010 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ot.        **   
2c020 20 20 20 20 79 65 74 20 72 75 6e 2e 0a 20 20 20      yet run..   
2c030 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c040 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c 6c 2d  **   (2) A full-
2c050 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61 6e 20  table-scan plan 
2c060 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65 64 65  cannot supercede
2c070 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20 75 6e   indexed plan un
2c080 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  less.        ** 
2c090 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c 2d 74        the full-t
2c0a0 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61 6e 20  able-scan is an 
2c0b0 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e 20 61  "optimal" plan a
2c0c0 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e  s defined above.
2c0d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c0e0 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c 6c      **   (3) All
2c0f0 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e 20   tables have an 
2c100 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2c110 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20  e or this table 
2c120 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20 20  lacks an.       
2c130 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58 45   **       INDEXE
2c140 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74  D BY clause or t
2c150 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20 74  his table uses t
2c160 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20 20  he specific.    
2c170 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e 64      **       ind
2c180 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ex specified by 
2c190 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20 63  its INDEXED BY c
2c1a0 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75 6c  lause.  This rul
2c1b0 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20 20  e ensures.      
2c1c0 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74 20    **       that 
2c1d0 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69 73  a best-so-far is
2c1e0 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65 64   always selected
2c1f0 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70 6f   even if an impo
2c200 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2c210 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61 74  *       combinat
2c220 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20 42  ion of INDEXED B
2c230 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67 69  Y clauses are gi
2c240 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 0a  ven.  The error.
2c250 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2c260 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
2c270 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62 61  d and relayed ba
2c280 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63  ck to the applic
2c290 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20 20  ation later..   
2c2a0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54 68       **       Th
2c2b0 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73 20  e NEVER() comes 
2c2c0 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72 75  about because ru
2c2d0 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72 65  le (2) above pre
2c2e0 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
2c2f0 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78 61         An indexa
2c300 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  ble full-table-s
2c310 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69 6e  can from reachin
2c320 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20 20  g rule (3)..    
2c330 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2c340 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61 6e  *   (4) The plan
2c350 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c 6f   cost must be lo
2c360 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20 70  wer than prior p
2c370 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20 74 68 65  lans or else the
2c380 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c390 20 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 74    cost must be t
2c3a0 68 65 20 73 61 6d 65 20 61 6e 64 20 74 68 65 20  he same and the 
2c3b0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
2c3c0 75 73 74 20 62 65 20 6c 6f 77 65 72 2e 0a 20 20  ust be lower..  
2c3d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c3e0 20 69 66 28 20 28 73 43 6f 73 74 2e 75 73 65 64   if( (sCost.used
2c3f0 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 20 20  &notReady)==0   
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
2c420 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65            && (be
2c430 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e 64  stJ<0 || (notInd
2c440 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20 20  exed&m)!=0      
2c450 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
2c460 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c470 20 20 20 7c 7c 20 28 62 65 73 74 50 6c 61 6e 2e     || (bestPlan.
2c480 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c490 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2c4a0 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
2c4b0 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e        || (sCost.
2c4c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2c4d0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2c4e0 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20  N)!=0).         
2c4f0 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74 72     && (nUnconstr
2c500 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62  ained==0 || pTab
2c510 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  Item->pIndex==0 
2c520 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
2c530 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 4e              || N
2c540 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c 61 6e  EVER((sCost.plan
2c550 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2c560 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d  _NOT_FULLSCAN)!=
2c570 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
2c580 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 73  && (bestJ<0 || s
2c590 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50  Cost.rCost<bestP
2c5a0 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20 20 2f  lan.rCost      /
2c5b0 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
2c5c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f           || (sCo
2c5d0 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50 6c  st.rCost<=bestPl
2c5e0 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20 20  an.rCost .      
2c5f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 43             && sC
2c600 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 62 65  ost.plan.nRow<be
2c610 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77  stPlan.plan.nRow
2c620 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
2c630 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
2c640 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65 20 25  CE(("=== table %
2c650 64 20 69 73 20 62 65 73 74 20 73 6f 20 66 61 72  d is best so far
2c660 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2c670 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 63          " with c
2c680 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77 3d  ost=%g and nRow=
2c690 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20               j, 
2c6b0 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43 6f  sCost.rCost, sCo
2c6c0 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a  st.plan.nRow));.
2c6d0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50 6c            bestPl
2c6e0 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20 20  an = sCost;.    
2c6f0 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b        bestJ = j;
2c700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c710 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72     if( doNotReor
2c720 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
2c730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2c740 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30 20  ssert( bestJ>=0 
2c750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c760 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d 61 73  otReady & getMas
2c770 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2c780 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
2c790 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 57  Cursor) );.    W
2c7a0 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2c7b0 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74  Optimizer select
2c7c0 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  s table %d for l
2c7d0 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20 20 20  oop %d".        
2c7e0 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20 63          " with c
2c7f0 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77 3d  ost=%g and nRow=
2c800 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
2c810 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70 4c         bestJ, pL
2c820 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c 20  evel-pWInfo->a, 
2c830 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c 20  bestPlan.rCost, 
2c840 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2c850 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  ow));.    if( (b
2c860 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2c870 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
2c880 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
2c890 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
2c8a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
2c8b0 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
2c8c0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
2c8d0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
2c8e0 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
2c8f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62  .    testcase( b
2c900 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2c910 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2c920 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74  EXED );.    test
2c930 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70  case( bestPlan.p
2c940 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2c950 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29  ERE_TEMP_INDEX )
2c960 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c  ;.    if( bestPl
2c970 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2c980 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44  & (WHERE_INDEXED
2c990 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45  |WHERE_TEMP_INDE
2c9a0 58 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  X) ){.      pLev
2c9b0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
2c9c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2c9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2c9e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
2c9f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
2ca00 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
2ca10 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2ca20 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
2ca30 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
2ca40 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
2ca50 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66  u8)bestJ;.    if
2ca60 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
2ca70 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20  nRow>=(double)1 
2ca80 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
2ca90 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62  >nQueryLoop *= b
2caa0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
2cab0 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  w;.    }..    /*
2cac0 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74   Check that if t
2cad0 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64  he table scanned
2cae0 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74   by this loop it
2caf0 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20  eration had an. 
2cb00 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59     ** INDEXED BY
2cb10 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64   clause attached
2cb20 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65   to it, that the
2cb30 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20   named index is 
2cb40 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
2cb50 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20  d for the scan. 
2cb60 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65  If not, then que
2cb70 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68  ry compilation h
2cb80 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a  as failed..    *
2cb90 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
2cba0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  r..    */.    pI
2cbb0 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  dx = pTabList->a
2cbc0 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a  [bestJ].pIndex;.
2cbd0 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
2cbe0 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50        if( (bestP
2cbf0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2cc00 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2cc10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2cc20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2cc30 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2cc40 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  use index: %s", 
2cc50 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
2cc60 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
2cc70 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20  BeginError;.    
2cc80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cc90 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45   /* If an INDEXE
2cca0 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75  D BY clause is u
2ccb0 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64  sed, the bestInd
2ccc0 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  ex() function is
2ccd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2cce0 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74  anteed to find t
2ccf0 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69  he index specifi
2cd00 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45  ed in the INDEXE
2cd10 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  D BY clause.    
2cd20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e      ** if it fin
2cd30 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c  d an index at al
2cd40 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
2cd50 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70  sert( bestPlan.p
2cd60 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78  lan.u.pIdx==pIdx
2cd70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2cd80 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
2cd90 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2cda0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
2cdb0 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72  n"));.  if( pPar
2cdc0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2cdd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2cde0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2cdf0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
2ce00 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c   /* If the total
2ce10 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65   query only sele
2ce20 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  cts a single row
2ce30 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52  , then the ORDER
2ce40 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20   BY.  ** clause 
2ce50 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20  is irrelevant.. 
2ce60 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c   */.  if( (andFl
2ce70 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
2ce80 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65  UE)!=0 && ppOrde
2ce90 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72  rBy ){.    *ppOr
2cea0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
2ceb0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
2cec0 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  er is an UPDATE 
2ced0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
2cee0 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75  ent that is requ
2cef0 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75  esting.  ** to u
2cf00 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c  se a one-pass al
2cf10 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69  gorithm, determi
2cf20 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70  ne if this is ap
2cf30 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20  propriate..  ** 
2cf40 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  The one-pass alg
2cf50 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b  orithm only work
2cf60 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  s if the WHERE c
2cf70 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
2cf80 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  s.  ** the state
2cf90 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61  ment to update a
2cfa0 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a   single row..  *
2cfb0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
2cfc0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2cfd0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2cfe0 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==0 || pWInfo->n
2cff0 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66  Level==1 );.  if
2d000 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2d010 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2d020 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e  SIRED)!=0 && (an
2d030 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  dFlags & WHERE_U
2d040 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20  NIQUE)!=0 ){.   
2d050 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61   pWInfo->okOnePa
2d060 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e  ss = 1;.    pWIn
2d070 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73  fo->a[0].plan.ws
2d080 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f  Flags &= ~WHERE_
2d090 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  IDX_ONLY;.  }.. 
2d0a0 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62   /* Open all tab
2d0b0 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c  les in the pTabL
2d0c0 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69  ist and any indi
2d0d0 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72  ces selected for
2d0e0 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20  .  ** searching 
2d0f0 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2d100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  */.  sqlite3Code
2d110 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2d120 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73  rse, -1); /* Ins
2d130 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ert the cookie v
2d140 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a  erifier Goto */.
2d150 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
2d160 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e  itmask)0;.  pWIn
2d170 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64  fo->nRowOut = (d
2d180 6f 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69  ouble)1;.  for(i
2d190 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
2d1a0 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74  o->a; i<nTabList
2d1b0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
2d1c0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2d1d0 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
2d1e0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
2d1f0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
2d200 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
2d210 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2d220 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a  table/index */..
2d230 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
2d240 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2d250 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2d260 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
2d270 3e 70 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65  >pTab;.    pLeve
2d280 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61  l->iTabCur = pTa
2d290 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2d2a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
2d2b0 4f 75 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70  Out *= pLevel->p
2d2c0 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44  lan.nRow;.    iD
2d2d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
2d2e0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
2d2f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
2d300 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2d310 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2d320 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d  ral)!=0 || pTab-
2d330 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2d340 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
2d350 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66  */.    }else.#if
2d360 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d370 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2d380 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
2d390 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2d3a0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2d3b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2d3c0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
2d3d0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2d3e0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
2d3f0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
2d400 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
2d410 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2d420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d430 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
2d440 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
2d450 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
2d460 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
2d470 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
2d480 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2d490 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2d4a0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
2d4b0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
2d4c0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29  WHERE_OMIT_OPEN)
2d4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
2d4e0 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
2d4f0 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
2d500 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
2d510 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
2d520 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
2d530 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
2d540 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
2d550 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65  b, op);.      te
2d560 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43  stcase( pTab->nC
2d570 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
2d580 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
2d590 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  b->nCol==BMS );.
2d5a0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
2d5b0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
2d5c0 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29  pTab->nCol<BMS )
2d5d0 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
2d5e0 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
2d5f0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
2d600 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
2d610 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
2d620 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
2d630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d640 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74  hangeP4(v, sqlit
2d650 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2d660 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20  r(v)-1, .       
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d680 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f       SQLITE_INT_
2d690 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e  TO_PTR(n), P4_IN
2d6a0 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  T32);.        as
2d6b0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
2d6c0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
2d6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d6e0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
2d6f0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
2d700 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
2d710 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
2d720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d730 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2d740 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c  NDEX.    if( (pL
2d750 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2d760 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2d770 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20  INDEX)!=0 ){.   
2d780 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f     constructAuto
2d790 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73  maticIndex(pPars
2d7a0 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d  e, pWC, pTabItem
2d7b0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
2d7c0 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  el);.    }else.#
2d7d0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
2d7e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2d7f0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2d800 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
2d810 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c   Index *pIx = pL
2d820 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
2d830 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  x;.      KeyInfo
2d840 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
2d850 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
2d860 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
2d870 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70   int iIdxCur = p
2d880 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
2d890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2d8a0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
2d8b0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
2d8c0 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43     assert( iIdxC
2d8d0 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ur>=0 );.      s
2d8e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2d8f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
2d900 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74   iIdxCur, pIx->t
2d910 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d930 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
2d940 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
2d950 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
2d960 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2d970 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
2d980 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
2d990 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2d9a0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2d9b0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
2d9c0 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73  etMask(pWC->pMas
2d9d0 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
2d9e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
2d9f0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
2da00 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2da10 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
2da20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2da30 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2da40 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47  inError;..  /* G
2da50 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
2da60 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
2da70 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
2da80 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
2da90 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
2daa0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
2dab0 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
2dac0 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
2dad0 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
2dae0 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
2daf0 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
2db00 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69  or(i=0; i<nTabLi
2db10 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  st; i++){.    pL
2db20 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2db30 61 5b 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69  a[i];.    explai
2db40 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c  nOneScan(pParse,
2db50 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65   pTabList, pLeve
2db60 6c 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  l, i, pLevel->iF
2db70 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  rom, wctrlFlags)
2db80 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
2db90 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
2dba0 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74  t(pWInfo, i, wct
2dbb0 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64  rlFlags, notRead
2dbc0 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
2dbd0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76  iContinue = pLev
2dbe0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20  el->addrCont;.  
2dbf0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2dc00 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65  _TEST  /* For te
2dc10 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
2dc20 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
2dc30 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74    /* Record in t
2dc40 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e  he query plan in
2dc50 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
2dc60 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
2dc70 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69  e.  ** and the i
2dc80 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
2dc90 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e  ess it (if any).
2dca0 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69    If the table i
2dcb0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f  tself.  ** is no
2dcc0 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65  t used, its name
2dcd0 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20   is just '{}'.  
2dce0 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75  If no index is u
2dcf0 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64  sed.  ** the ind
2dd00 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20  ex is listed as 
2dd10 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72  "{}".  If the pr
2dd20 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
2dd30 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  d the.  ** index
2dd40 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20   name is '*'..  
2dd50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2dd60 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a  nTabList; i++){.
2dd70 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
2dd80 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
2dd90 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2dda0 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
2ddb0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2ddc0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
2ddd0 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
2dde0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
2ddf0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
2de00 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
2de10 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69  me;.    n = sqli
2de20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
2de30 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
2de40 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
2de50 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30  3_query_plan)-10
2de60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2de70 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2de80 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2de90 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
2dea0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
2deb0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
2dec0 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
2ded0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
2dee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2def0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
2df00 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2df10 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
2df20 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
2df30 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
2df40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
2df50 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
2df60 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
2df70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
2df80 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2df90 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
2dfa0 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  EQ );.    testca
2dfb0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
2dfc0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2dfd0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a  _ROWID_RANGE );.
2dfe0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2dff0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
2e000 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
2e010 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
2e020 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
2e030 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
2e040 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
2e050 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e  * ", 2);.      n
2e060 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
2e070 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65  }else if( (pLeve
2e080 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2e090 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2e0a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  !=0 ){.      n =
2e0b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2e0c0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e  (pLevel->plan.u.
2e0d0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
2e0e0 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
2e0f0 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
2e100 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20  3_query_plan)-2 
2e110 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2e120 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
2e130 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70  _plan[nQPlan], p
2e140 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2e150 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  dx->zName, n);. 
2e160 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
2e170 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
2e180 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2e190 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
2e1a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e1b0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
2e1c0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2e1d0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
2e1e0 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51   ", 3);.      nQ
2e1f0 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
2e200 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51  .  }.  while( nQ
2e210 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65  Plan>0 && sqlite
2e220 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2e230 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20  lan-1]==' ' ){. 
2e240 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
2e250 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20  _plan[--nQPlan] 
2e260 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
2e270 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2e280 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50  Plan] = 0;.  nQP
2e290 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20  lan = 0;.#endif 
2e2a0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f  /* SQLITE_TEST /
2e2b0 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65  / Testing and de
2e2c0 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
2e2d0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64   */..  /* Record
2e2e0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
2e2f0 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65  n address in the
2e300 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2e310 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a  ture.  Then.  **
2e320 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   clean up and re
2e330 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  turn..  */.  ret
2e340 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
2e350 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
2e360 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
2e370 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a  hereBeginError:.
2e380 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a    if( pWInfo ){.
2e390 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
2e3a0 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  ryLoop = pWInfo-
2e3b0 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2e3c0 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46  ;.    whereInfoF
2e3d0 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2e3e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2e3f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2e400 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
2e410 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
2e420 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
2e430 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
2e440 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
2e450 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2e460 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2e470 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
2e480 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
2e490 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2e4a0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
2e4b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2e4c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2e4d0 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
2e4e0 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63  l *pLevel;.  Src
2e4f0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2e500 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2e510 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2e520 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2e530 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
2e540 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
2e550 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
2e560 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2e570 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2e580 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  (i=pWInfo->nLeve
2e590 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
2e5a0 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2e5b0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
2e5c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2e5d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2e5e0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
2e5f0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2e600 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2e610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e620 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp2(v, pLevel-
2e630 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2e640 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
2e650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e660 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2e670 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p5);.    }.  
2e680 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2e690 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2e6a0 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
2e6b0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
2e6c0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
2e6d0 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
2e6e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2e6f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2e700 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2e710 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
2e720 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
2e730 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
2e740 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
2e750 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
2e760 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
2e770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
2e790 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
2e7a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e7b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e7c0 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c  Next, pIn->iCur,
2e7d0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29   pIn->addrInTop)
2e7e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e7f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2e800 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d   pIn->addrInTop-
2e810 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
2e820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e830 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
2e840 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  .aInLoop);.    }
2e850 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2e860 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2e870 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
2e880 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2e890 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
2e8a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
2e8b0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
2e8c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2e8d0 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
2e8e0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
2e8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
2e900 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2e910 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2e920 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
2e930 20 20 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70     || (pLevel->p
2e940 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e950 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
2e960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c  );.      if( (pL
2e970 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2e980 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2e990 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
2e9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e9b0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
2e9c0 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ow, pTabList->a[
2e9d0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2e9e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2e9f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
2ea00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2ea10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2ea20 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
2ea30 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
2ea40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ea50 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50  ( pLevel->op==OP
2ea60 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20  _Return ){.     
2ea70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ea80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2ea90 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
2eaa0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
2eab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2eac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ead0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2eae0 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
2eaf0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2eb00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2eb10 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2eb20 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
2eb30 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
2eb40 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
2eb50 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
2eb60 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
2eb70 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
2eb80 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
2eb90 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2eba0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
2ebb0 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
2ebc0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
2ebd0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
2ebe0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
2ebf0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
2ec00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  */.  assert( pWI
2ec10 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c  nfo->nLevel==1 |
2ec20 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
2ec30 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ==pTabList->nSrc
2ec40 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
2ec50 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2ec60 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
2ec70 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  l; i++, pLevel++
2ec80 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2ec90 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2eca0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2ecb0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2ecc0 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
2ecd0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2ece0 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2ecf0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2ed00 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2ed10 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2ed20 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ral)==0.     && 
2ed30 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
2ed40 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
2ed50 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2ed60 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29  HERE_OMIT_CLOSE)
2ed70 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2ed80 20 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c   int ws = pLevel
2ed90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
2eda0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
2edb0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
2edc0 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
2edd0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
2ede0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2edf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2ee00 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2ee10 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
2ee20 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
2ee30 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2ee40 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
2ee50 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29  TEMP_INDEX)==0 )
2ee60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ee70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2ee80 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
2ee90 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2eea0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2eeb0 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
2eec0 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
2eed0 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  e code substitut
2eee0 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
2eef0 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
2ef00 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65  e index in prefe
2ef10 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62  rence to the tab
2ef20 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74  le. Sometimes, t
2ef30 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
2ef40 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20   the table need 
2ef50 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72  never be read fr
2ef60 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65  om. This is a pe
2ef70 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c  rformance boost,
2ef80 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76  .    ** as the v
2ef90 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20  dbe level waits 
2efa0 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20  until the table 
2efb0 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61  is read before a
2efc0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73  ctually.    ** s
2efd0 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eeking the table
2efe0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72   cursor to the r
2eff0 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64  ecord correspond
2f000 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
2f010 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  nt.    ** positi
2f020 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  on in the index.
2f030 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
2f040 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
2f050 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
2f060 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
2f070 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
2f080 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
2f090 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
2f0a0 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
2f0b0 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
2f0c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
2f0d0 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
2f0e0 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
2f0f0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
2f100 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
2f110 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
2f120 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
2f130 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
2f140 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
2f150 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
2f160 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
2f170 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2f180 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2f190 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2f1a0 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  0 && !db->malloc
2f1b0 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69  Failed){.      i
2f1c0 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20  nt k, j, last;. 
2f1d0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
2f1e0 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
2f1f0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
2f200 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20  an.u.pIdx;..    
2f210 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
2f220 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
2f230 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2f240 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
2f250 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
2f260 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f270 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2f280 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
2f290 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
2f2a0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
2f2b0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
2f2c0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2f2d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f2e0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
2f2f0 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
2f300 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
2f310 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
2f320 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
2f330 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
2f340 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
2f350 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
2f360 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
2f370 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
2f380 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
2f390 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2f3b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
2f3c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f3d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2f3e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2f3f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
2f400 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
2f410 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49           || j<pI
2f420 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
2f430 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2f440 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2f450 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
2f460 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
2f470 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
2f480 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
2f490 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
2f4a0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
2f4b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2f4c0 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
2f4d0 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
2f4e0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
2f4f0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2f500 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
2f510 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2f520 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
2f530 7d 0a                                            }.