/ Hex Artifact Content
Login

Artifact a6d127dd05daf0f9ffa654edfab4f1236dc759b7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20  _ENABLE_STAT3.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 33 20 2a 2f 0a 23 65  sing stat3 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  ereTerms..**.** 
15f0: 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70  Explanation of p
1600: 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48  Outer:  For a WH
1610: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
1620: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
1630: 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62         a AND ((b
1640: 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e   AND c) OR (d AN
1650: 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a  D e)) AND f.**.*
1660: 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61  * There are sepa
1670: 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65  rate WhereClause
1680: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65   objects for the
1690: 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e   whole clause an
16a0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62  d for.** the sub
16b0: 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20  clauses "(b AND 
16c0: 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20  c)" and "(d AND 
16d0: 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72  e)".  The pOuter
16e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a   field of the.**
16f0: 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e   subclauses poin
1700: 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ts to the WhereC
1710: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72  lause object for
1720: 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73   the whole claus
1730: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1740: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
1750: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1770: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1780: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
1790: 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70  MaskSet;  /* Map
17a0: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75  ping of table cu
17b0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
17c0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 42 69  bitmasks */.  Bi
17d0: 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20  tmask vmask;    
17e0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
17f0: 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 76 69  k identifying vi
1800: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
1810: 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ors */.  WhereCl
1820: 61 75 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20  ause *pOuter;   
1830: 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75    /* Outer conju
1840: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f  nction */.  u8 o
1850: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1860: 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70       /* Split op
1870: 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20  erator.  TK_AND 
1880: 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 75 31  or TK_OR */.  u1
1890: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
18a0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
18b0: 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e  include WHERE_AN
18c0: 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69 6e 74 20  D_ONLY */.  int 
18d0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
1900: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
1910: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1920: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
1930: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1940: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1950: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
1960: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
1970: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
1980: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1990: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
19a0: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
19b0: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
19c0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
19d0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
19e0: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
19f0: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
1a00: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
1a10: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
1a20: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
1a30: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1a40: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1a50: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
1a60: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
1a70: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
1a80: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1a90: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
1aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1ab0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1ac0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
1ad0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1ae0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
1af0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
1b00: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1b10: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
1b20: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
1b30: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
1b40: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
1b50: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
1b60: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
1b70: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
1b80: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
1b90: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
1ba0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1bb0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1bc0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1bd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1be0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1bf0: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
1c00: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
1c10: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
1c20: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
1c30: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
1c40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1c50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1c60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1c70: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1c80: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1c90: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1ca0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1cb0: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1cc0: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1cd0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1ce0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1cf0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1d00: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1d10: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
1d20: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
1d30: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
1d40: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
1d50: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
1d60: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
1d70: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1d80: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1d90: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1da0: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1db0: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1dc0: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1dd0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1de0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1df0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1e00: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1e10: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
1e20: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
1e30: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
1e40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1e50: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
1e60: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
1e70: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1e80: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
1e90: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1ea0: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1eb0: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1ec0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1ed0: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1ee0: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1ef0: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1f00: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
1f10: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1f20: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
1f30: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
1f40: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
1f50: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
1f60: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1f70: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
1f80: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
1f90: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
1fa0: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
1fb0: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
1fc0: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
1fd0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1fe0: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
1ff0: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
2000: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
2010: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
2020: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
2030: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
2040: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
2050: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
2060: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
2070: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
2080: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
2090: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
20a0: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
20b0: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
20c0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
20d0: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
20e0: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
20f0: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
2100: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
2110: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
2120: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
2130: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
2140: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
2150: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
2180: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
2190: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
21a0: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
21b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21c0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
21d0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
21e0: 2a 20 41 20 57 68 65 72 65 43 6f 73 74 20 6f 62  * A WhereCost ob
21f0: 6a 65 63 74 20 72 65 63 6f 72 64 73 20 61 20 6c  ject records a l
2200: 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20 61  ookup strategy a
2210: 6e 64 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  nd the estimated
2220: 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70 75 72 73  .** cost of purs
2230: 75 69 6e 67 20 74 68 61 74 20 73 74 72 61 74 65  uing that strate
2240: 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  gy..*/.struct Wh
2250: 65 72 65 43 6f 73 74 20 7b 0a 20 20 57 68 65 72  ereCost {.  Wher
2260: 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20 20 20 2f  ePlan plan;    /
2270: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 73 74 72  * The lookup str
2280: 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c  ategy */.  doubl
2290: 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  e rCost;      /*
22a0: 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74 20 6f 66   Overall cost of
22b0: 20 70 75 72 73 75 69 6e 67 20 74 68 69 73 20 73   pursuing this s
22c0: 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a  earch strategy *
22d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64  /.  Bitmask used
22e0: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
22f0: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65  k of cursors use
2300: 64 20 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a  d by this plan *
2310: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d  /.};../*.** Bitm
2320: 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65  asks for the ope
2330: 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69  rators that indi
2340: 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ces are able to 
2350: 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20  exploit.  An.** 
2360: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
2370: 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65  n of these value
2380: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  s can be used wh
2390: 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  en searching for
23a0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
23b0: 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a   where clause..*
23c0: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
23d0: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
23e0: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
23f0: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
2400: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2410: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
2420: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
2430: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
2440: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
2450: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
2460: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
2470: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
2480: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
2490: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
24a0: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
24b0: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
24c0: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
24d0: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
24e0: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
24f0: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
2500: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
2510: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
2520: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2530: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
2540: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
2550: 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30  fine WO_NOOP   0
2560: 78 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68  x800       /* Th
2570: 69 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  is term does not
2580: 20 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68   restrict search
2590: 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69   space */..#defi
25a0: 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66  ne WO_ALL    0xf
25b0: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
25c0: 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65   of all possible
25d0: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
25e0: 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c  #define WO_SINGL
25f0: 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a  E 0x0ff       /*
2600: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e   Mask of all non
2610: 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76  -compound WO_* v
2620: 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alues */../*.** 
2630: 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67  Value for wsFlag
2640: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65  s returned by be
2650: 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74  stIndex() and st
2660: 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65  ored in.** Where
2670: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20  Level.wsFlags.  
2680: 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74 65  These flags dete
2690: 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61 72  rmine which sear
26a0: 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73  ch.** strategies
26b0: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
26c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73  ..**.** The leas
26d0: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31 32  t significant 12
26e0: 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76 65   bits is reserve
26f0: 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72 20  d as a mask for 
2700: 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76 65  WO_ values above
2710: 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c 65  ..** The WhereLe
2720: 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c  vel.wsFlags fiel
2730: 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74  d is usually set
2740: 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   to WO_IN|WO_EQ|
2750: 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75  WO_ISNULL..** Bu
2760: 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  t if the table i
2770: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
2780: 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  e of a left join
2790: 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46  , WhereLevel.wsF
27a0: 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20 74  lags.** is set t
27b0: 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20  o WO_IN|WO_EQ.  
27c0: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 77  The WhereLevel.w
27d0: 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61 6e  sFlags field can
27e0: 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61 73   then be used as
27f0: 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61 72  .** the "op" par
2800: 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54 65  ameter to findTe
2810: 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20 72  rm when we are r
2820: 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69 74  esolving equalit
2830: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
2840: 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  * ISNULL constra
2850: 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20 6e  ints will then n
2860: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68  ot be used on th
2870: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2880: 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e   a left.** join.
2890: 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37 20    Tickets #2177 
28a0: 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23 64  and #2189..*/.#d
28b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
28c0: 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30 31  D_EQ     0x00001
28d0: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  000  /* rowid=EX
28e0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
28f0: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
2900: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
2910: 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f  E  0x00002000  /
2920: 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64  * rowid<EXPR and
2930: 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a  /or rowid>EXPR *
2940: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2950: 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30  COLUMN_EQ    0x0
2960: 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45 58  0010000  /* x=EX
2970: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
2980: 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   or x IS NULL */
2990: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
29a0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
29b0: 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58 50  020000  /* x<EXP
29c0: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
29d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
29e0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
29f0: 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20 49  00040000  /* x I
2a00: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2a10: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
2a20: 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30 30  NULL  0x00080000
2a30: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
2a40: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2a50: 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78 30  INDEXED      0x0
2a60: 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79 74  00f0000  /* Anyt
2a70: 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20 61  hing that uses a
2a80: 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69  n index */.#defi
2a90: 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c  ne WHERE_NOT_FUL
2aa0: 4c 53 43 41 4e 20 30 78 31 30 30 66 33 30 30 30  LSCAN 0x100f3000
2ab0: 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64 6f    /* Does not do
2ac0: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
2ad0: 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  an */.#define WH
2ae0: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
2af0: 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a 20   0x000f1000  /* 
2b00: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
2b10: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
2b20: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2b30: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
2b40: 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0100000  /* x<EX
2b50: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
2b60: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2b70: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
2b80: 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30 30  MIT    0x0020000
2b90: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
2ba0: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
2bb0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
2bc0: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
2bd0: 20 30 78 30 30 33 30 30 30 30 30 20 20 2f 2a 20   0x00300000  /* 
2be0: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
2bf0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
2c00: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
2c10: 20 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20       0x00800000 
2c20: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
2c30: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
2c40: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2c50: 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 30 78  _ORDERBY      0x
2c60: 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f 75 74  01000000  /* Out
2c70: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
2c80: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
2c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2ca0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 30  E_REVERSE      0
2cb0: 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20 53 63  x02000000  /* Sc
2cc0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
2cd0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2ce0: 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20  HERE_UNIQUE     
2cf0: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d00: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
2d10: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
2d20: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2d30: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2d40: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2d50: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2d60: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2d70: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2d80: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2d90: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2da0: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2db0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2dc0: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2dd0: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2de0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2df0: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e00: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e10: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2e20: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2e30: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 0a  or DISTINCT */..
2e40: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2e50: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2e60: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2e70: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
2e80: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2e90: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
2ea0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
2eb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
2ec0: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
2ed0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73  alized */.  Pars
2ee0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2f00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2f10: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2f20: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
2f30: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
2f40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
2f50: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20  o bitmasks */.  
2f60: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68           /* Migh
2f80: 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f  t include WHERE_
2f90: 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  AND_ONLY */.){. 
2fa0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2fb0: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2fc0: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2fd0: 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  t;.  pWC->pOuter
2fe0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
2ff0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
3000: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
3010: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
3020: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
3030: 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e  aStatic;.  pWC->
3040: 76 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43  vmask = 0;.  pWC
3050: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
3060: 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a  ctrlFlags;.}../*
3070: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3080: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3090: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
30a0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
30b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
30c0: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
30d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
30e0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
30f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3100: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
3110: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
3120: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
3130: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
3140: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
3150: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3160: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3170: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3180: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3190: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
31a0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
31b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
31c0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
31d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
31e0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
31f0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
3200: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
3210: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
3230: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
3240: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
3250: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3260: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
3270: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
3280: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
3290: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
32a0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
32b0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
32c0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
32d0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
32e0: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
32f0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
3300: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3310: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
3320: 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  b;.  for(i=pWC->
3330: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
3340: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
3350: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77  +){.    if( a->w
3360: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
3370: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
3380: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3390: 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a  (db, a->pExpr);.
33a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d      }.    if( a-
33b0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
33c0: 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  ORINFO ){.      
33d0: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
33e0: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e  e(db, a->u.pOrIn
33f0: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
3400: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3410: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a  TERM_ANDINFO ){.
3420: 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e        whereAndIn
3430: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3440: 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20  u.pAndInfo);.   
3450: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43   }.  }.  if( pWC
3460: 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  ->a!=pWC->aStati
3470: 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
3480: 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e  DbFree(db, pWC->
3490: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
34a0: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
34b0: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
34c0: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
34d0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
34e0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
34f0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
3500: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
3510: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
3520: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
3530: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
3540: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
3550: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
3560: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
3570: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
3580: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
3590: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
35a0: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
35b0: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
35c0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
35d0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
35e0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
35f0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
3600: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
3610: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
3620: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
3630: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
3640: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
3650: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3660: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
3670: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
3680: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
3690: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
36a0: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
36b0: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
36c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
36d0: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
36e0: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
36f0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
3700: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
3710: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
3720: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
3730: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
3740: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
3750: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
3760: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
3770: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
3780: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
3790: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
37a0: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
37b0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
37c0: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
37d0: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
37e0: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
37f0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
3800: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
3810: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
3820: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
3830: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
3840: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
3850: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3860: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
3870: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
3880: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
3890: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
38a0: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
38b0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
38c0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
38d0: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
38e0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
38f0: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31  ;  /* EV: R-0021
3900: 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28  1-15100 */.  if(
3910: 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43   pWC->nTerm>=pWC
3920: 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57  ->nSlot ){.    W
3930: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d  hereTerm *pOld =
3940: 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c   pWC->a;.    sql
3950: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
3960: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
3970: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
3980: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
3990: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
39a0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
39b0: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
39c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
39d0: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
39e0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
39f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3a00: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
3a10: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
3a20: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
3a30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3a40: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
3a50: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
3a60: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
3a70: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
3a80: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
3a90: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
3aa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
3ab0: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
3ac0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
3ad0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
3ae0: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
3af0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
3b00: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
3b10: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
3b20: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
3b30: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20  m->pExpr = p;.  
3b40: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
3b50: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
3b60: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
3b70: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
3b80: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
3b90: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
3ba0: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
3bb0: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
3bc0: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
3bd0: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
3be0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
3bf0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
3c00: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
3c10: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
3c20: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
3c30: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
3c40: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
3c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
3c60: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
3c70: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
3c80: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
3c90: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
3ca0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
3cb0: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
3cc0: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
3cd0: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
3ce0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
3cf0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
3d00: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
3d10: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
3d20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
3d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
3d40: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
3d50: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
3d60: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
3d70: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
3d80: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
3d90: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
3da0: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
3db0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
3dc0: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
3dd0: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
3de0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
3df0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
3e00: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
3e10: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
3e20: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
3e30: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
3e40: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
3e50: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
3e60: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
3e70: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
3e80: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
3e90: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
3ea0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
3eb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
3ec0: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
3ed0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3ee0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
3ef0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
3f00: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
3f10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3f20: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
3f30: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
3f40: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
3f50: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
3f60: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
3f70: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
3f80: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
3f90: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
3fa0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
3fb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3fc0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
3fd0: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
3fe0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
3ff0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
4000: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
4010: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
4020: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
4030: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4040: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4050: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4060: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4070: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4080: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4090: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
40a0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
40b0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
40c0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
40d0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
40e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
40f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
4100: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
4110: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
4120: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
4130: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4140: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4150: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4160: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4170: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4190: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
41a0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
41b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
41c0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
41d0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
41e0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
41f0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
4200: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
4210: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
4220: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
4230: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4240: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4250: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4260: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4270: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4280: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4290: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
42a0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
42b0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
42c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
42d0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
42e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
42f0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
4300: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
4310: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
4320: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
4330: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4340: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4350: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4360: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4370: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4380: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4390: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
43a0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
43b0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
43c0: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
43d0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
43e0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
43f0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4400: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4410: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4420: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4430: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4440: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4450: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4460: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4470: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4480: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4490: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
44a0: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
44b0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
44c0: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
44d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
44e0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
44f0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4500: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4510: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4520: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4530: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4540: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4550: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4560: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4570: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4580: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4590: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
45a0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
45b0: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
45c0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
45d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
45e0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
45f0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4600: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4610: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4620: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4630: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4640: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4650: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4660: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4670: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4680: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4690: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
46a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
46b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
46c0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
46d0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
46e0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
46f0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4700: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4720: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4730: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4740: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4750: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4760: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4770: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4780: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4790: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
47a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
47b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
47c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
47d0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
47e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
47f0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4800: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4810: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4820: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4830: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4840: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4850: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4860: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4870: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4880: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4890: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
48a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
48b0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
48c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
48d0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
48e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
48f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4900: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4910: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4920: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4930: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4940: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4950: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4960: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4970: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
4980: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
4990: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
49a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
49b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
49c0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
49d0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
49e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
49f0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
4a00: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4a10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4a20: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
4a30: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4a40: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4a50: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
4a60: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
4a70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4a80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4a90: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
4aa0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
4ab0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
4ac0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ad0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
4ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
4af0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
4b00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4b10: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
4b20: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
4b30: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4b40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4b50: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
4b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4b70: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4b80: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4b90: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4ba0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4bb0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
4bc0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
4bd0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
4be0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
4bf0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
4c00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4c10: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4c20: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4c30: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4c40: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4c50: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4c60: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4c70: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4c80: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4c90: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4ca0: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4cb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
4cc0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
4cd0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4ce0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
4cf0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
4d00: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
4d10: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4d20: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4d30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4d40: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d50: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4d60: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4d70: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4d80: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d90: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4da0: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4db0: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4dc0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4dd0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4df0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4e00: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4e10: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4e20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e30: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4e40: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4e50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4e60: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4e70: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e80: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4ea0: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4eb0: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ec0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4ed0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4ee0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4ef0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4f00: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4f10: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4f20: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4f30: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4f40: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4f50: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4f60: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4f70: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4f80: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4f90: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4fa0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4fb0: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4fc0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4fd0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4fe0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4ff0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
5000: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
5010: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
5020: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
5030: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
5040: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
5050: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
5060: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
5070: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
5080: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
5090: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
50a0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
50b0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
50c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
50d0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
50e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
50f0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
5100: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
5110: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
5120: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
5130: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
5140: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
5150: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
5160: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5170: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
5180: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
5190: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
51a0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
51b0: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
51c0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
51d0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
51e0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
51f0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
5200: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
5210: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
5220: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
5230: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
5240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5250: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5260: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
5270: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
5280: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5290: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
52a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
52b0: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
52c0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
52d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
52e0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
52f0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
5300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
5310: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5320: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5330: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5340: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5350: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5360: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5370: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5380: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5390: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
53a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
53b0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
53c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
53d0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
53e0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
53f0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
5400: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
5410: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5420: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5430: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5440: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5450: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5460: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5470: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5480: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5490: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
54a0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
54b0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
54c0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
54d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
54e0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
54f0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
5500: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
5510: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5520: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5530: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5540: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5550: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5560: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5570: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5580: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5590: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
55a0: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
55b0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
55c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
55d0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
55e0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
55f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5600: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
5610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5620: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5630: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5640: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5650: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5660: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5670: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5680: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5690: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
56a0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
56b0: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
56c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
56d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
56e0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
56f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5700: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
5710: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5720: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5730: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5740: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5750: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5760: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5770: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5780: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5790: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
57a0: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
57b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
57c0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
57d0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
57e0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
57f0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
5800: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5810: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5820: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5830: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5840: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5850: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5860: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5870: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5880: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5890: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
58a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
58b0: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
58c0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
58d0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
58e0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5900: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
5910: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5920: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5930: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5940: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5950: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5960: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5970: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5980: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5990: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
59a0: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
59b0: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
59c0: 20 66 6f 72 28 3b 20 70 57 43 3b 20 70 57 43 3d   for(; pWC; pWC=
59d0: 70 57 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  pWC->pOuter){.  
59e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
59f0: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
5a00: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
5a10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
5a20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5a30: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 26  =iCur.         &
5a40: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
5a50: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
5a60: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
5a70: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5a80: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
5a90: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
5aa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70  ->eOperator & op
5ab0: 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
5ac0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 26        if( pIdx &
5ad0: 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
5ae0: 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  or!=WO_ISNULL ){
5af0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
5b00: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
5b10: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  pr;.          Co
5b20: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
5b30: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
5b40: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69  aff;.          i
5b50: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
5b60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5b70: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 0a  pWC->pParse;.  .
5b80: 20 20 20 20 20 20 20 20 20 20 69 64 78 61 66 66            idxaff
5b90: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
5ba0: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
5bb0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
5bc0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
5bd0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
5be0: 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e  X, idxaff) ) con
5bf0: 74 69 6e 75 65 3b 0a 20 20 0a 20 20 20 20 20 20  tinue;.  .      
5c00: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
5c10: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
5c20: 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65  sequence require
5c30: 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20  d from an index 
5c40: 66 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  for.          **
5c50: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
5c60: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
5c70: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
5c80: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
5c90: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20      ** value in 
5ca0: 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a  variable pColl..
5cb0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
5cc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
5cd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
5ce0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
5cf0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
5d00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5d10: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
5d20: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
5d30: 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c    assert(pColl |
5d40: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b  | pParse->nErr);
5d50: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f  .  .          fo
5d60: 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43  r(j=0; pIdx->aiC
5d70: 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d  olumn[j]!=iColum
5d80: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
5d90: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
5da0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
5db0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5dd0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
5de0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5df0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
5e00: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20  x->azColl[j]) ) 
5e10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
5e30: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20  rn pTerm;.      
5e40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5e50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5e60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5e70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5e80: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5e90: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
5ea0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
5eb0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
5ec0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
5ed0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
5ee0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5ef0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5f00: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5f10: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5f20: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5f30: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5f40: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5f50: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5f60: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5f70: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5f80: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
5f90: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
5fa0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
5fb0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
5fc0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
5fd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5fe0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5ff0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
6000: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6010: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6020: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
6030: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
6040: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
6050: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
6060: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
6070: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
6080: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
6090: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
60a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
60b0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
60c0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
60d0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
60e0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
60f0: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
6100: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
6110: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
6120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
6130: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
6140: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6150: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
6160: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
6170: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
6180: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
6190: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
61a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
61b0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
61c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
61d0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
61e0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
61f0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
6200: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
6210: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
6220: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
6230: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
6240: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
6250: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
6260: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
6270: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
6280: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
6290: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
62a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
62b0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
62c0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
62d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
62e0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
62f0: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
6300: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
6310: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
6320: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
6330: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
6340: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
6350: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
6360: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
6390: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
63a0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
63b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
63c0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
63d0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
63e0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
63f0: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
6400: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
6410: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
6420: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6430: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
6440: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6450: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
6460: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
6470: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6490: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
64a0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
64b0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
64c0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
64d0: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
64e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
64f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
6500: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
6510: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
6520: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
6530: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6540: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
6550: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
6560: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
6570: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69  K_COLUMN || sqli
6580: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
6590: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
65a0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
65b0: 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34  * IMP: R-02065-4
65c0: 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68 61  9465 The left-ha
65d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4c  nd side of the L
65e0: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
65f0: 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a  ator must.    **
6600: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
6610: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
6620: 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66 69  n with TEXT affi
6630: 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  nity. */.    ret
6640: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
6650: 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  ert( pLeft->iCol
6660: 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  umn!=(-1) ); /* 
6670: 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76 65  Because IPK neve
6680: 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20 2a  r has AFF_TEXT *
6690: 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c  /..  pRight = pL
66a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
66b0: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
66c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
66d0: 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
66e0: 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70   op = pRight->op
66f0: 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d  2;.  }.  if( op=
6700: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6710: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65      Vdbe *pRepre
6720: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70  pare = pParse->p
6730: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69  Reprepare;.    i
6740: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74  nt iCol = pRight
6750: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
6760: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Val = sqlite3Vdb
6770: 65 47 65 74 56 61 6c 75 65 28 70 52 65 70 72 65  eGetValue(pRepre
6780: 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49  pare, iCol, SQLI
6790: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
67a0: 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
67b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
67c0: 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54  (pVal)==SQLITE_T
67d0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  EXT ){.      z =
67e0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
67f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
6800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6810: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
6820: 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
6830: 2c 20 69 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a  , iCol); /* IMP:
6840: 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a   R-23257-02778 *
6850: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  /.    assert( pR
6860: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  ight->op==TK_VAR
6870: 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d  IABLE || pRight-
6880: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
6890: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
68a0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
68b0: 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d  .    z = pRight-
68c0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  >u.zToken;.  }. 
68d0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e   if( z ){.    cn
68e0: 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
68f0: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
6900: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
6910: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
6920: 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  [2] ){.      cnt
6930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
6940: 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21  ( cnt!=0 && 255!
6950: 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b  =(u8)z[cnt-1] ){
6960: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72  .      Expr *pPr
6970: 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73  efix;.      *pis
6980: 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63  Complete = c==wc
6990: 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d  [0] && z[cnt+1]=
69a0: 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69  =0;.      pPrefi
69b0: 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  x = sqlite3Expr(
69c0: 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a  db, TK_STRING, z
69d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
69e0: 65 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e  efix ) pPrefix->
69f0: 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20  u.zToken[cnt] = 
6a00: 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66  0;.      *ppPref
6a10: 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20  ix = pPrefix;.  
6a20: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56      if( op==TK_V
6a30: 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ARIABLE ){.     
6a40: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
6a50: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
6a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6a70: 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69  etVarmask(v, pRi
6a80: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f  ght->iColumn); /
6a90: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
6aa0: 32 37 37 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  2778 */.        
6ab0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
6ac0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
6ad0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
6ae0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
6af0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
6b00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
6b10: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
6b20: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
6b30: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
6b40: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
6b50: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
6b60: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
6b70: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
6b80: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
6b90: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
6ba0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
6bb0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
6bc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
6bd0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
6be0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
6bf0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
6c00: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
6c10: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
6c20: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
6c30: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
6c40: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
6c50: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
6c60: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6c70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6c80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
6c90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6ca0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
6cb0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
6cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6cd0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
6ce0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6cf0: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
6d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6d10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6d20: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
6d50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
6d60: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
6d70: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
6d80: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
6d90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6da0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
6db0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
6dc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6dd0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6de0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6df0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6e00: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6e10: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
6e20: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
6e30: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
6e40: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
6e50: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
6e60: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
6e70: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
6e80: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
6e90: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
6ea0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
6eb0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
6ec0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
6ed0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6ee0: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6f00: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
6f10: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
6f20: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
6f30: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6f40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6f50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6f60: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6f70: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
6f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6f90: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
6fa0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
6fb0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
6fc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
6fd0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6fe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6ff0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
7000: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
7010: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
7020: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
7030: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
7040: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
7050: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
7060: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7070: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
7080: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
70a0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
70b0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
70c0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
70d0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
70e0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
70f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
7100: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
7110: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
7120: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
7130: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
7140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
7150: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
7160: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7170: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7180: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
7190: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
71a0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
71b0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
71c0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
71d0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
71e0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
71f0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
7200: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
7210: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
7240: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
7250: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
7260: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
7270: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
7280: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
7290: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
72a0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
72b0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
72c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
72d0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
72e0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
72f0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
7300: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
7310: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
7320: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
7330: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
7340: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
7350: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
7360: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
7370: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
7380: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
7390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
73a0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
73b0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
73c0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
73d0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
73e0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
73f0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
7400: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
7410: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
7420: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
7430: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
7440: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
7450: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
7460: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
7470: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
7480: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
7490: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
74a0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
74b0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
74c0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
74d0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
74e0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
74f0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7500: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7510: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
7520: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
7530: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
7540: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
7550: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
7560: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
7570: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
7580: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
7590: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
75a0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
75b0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
75c0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
75d0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
75e0: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
75f0: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
7600: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7610: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
7620: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
7630: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
7640: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
7650: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
7660: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
7670: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
7680: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
7690: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
76a0: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
76b0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
76c0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
76d0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
76e0: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
76f0: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
7700: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
7710: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7720: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
7730: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
7740: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
7750: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7760: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
7770: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
7780: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
7790: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
77a0: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
77b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
77c0: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
77d0: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
77e0: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
77f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7800: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
7810: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
7820: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
7830: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
7840: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
7850: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
7860: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
7870: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
7880: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
7890: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
78a0: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
78b0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
78c0: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
78d0: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
78e0: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
78f0: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
7900: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
7910: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
7920: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
7930: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
7940: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
7950: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
7960: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
7970: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
7980: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
7990: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
79a0: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
79b0: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
79c0: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
79d0: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
79e0: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
79f0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
7a00: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
7a10: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
7a20: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
7a30: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7a40: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
7a50: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
7a60: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
7a70: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
7a80: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
7a90: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
7aa0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
7ab0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
7ac0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7ad0: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
7ae0: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
7af0: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
7b00: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
7b10: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
7b20: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
7b30: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
7b40: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
7b50: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
7b60: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
7b70: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
7b80: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
7b90: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
7ba0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
7bb0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
7bc0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
7bd0: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
7be0: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
7bf0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
7c00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
7c10: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
7c20: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
7c30: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
7c40: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
7c50: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
7c60: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
7c70: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
7c80: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
7c90: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
7ca0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
7cb0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
7cc0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
7cd0: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7ce0: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7cf0: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7d00: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7d10: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
7d20: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
7d30: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
7d40: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
7d50: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
7d60: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
7d70: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
7d80: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
7d90: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
7da0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
7db0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
7dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7dd0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7de0: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7df0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7e00: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7e10: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
7e20: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
7e30: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
7e40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7e50: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e70: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
7e80: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
7e90: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
7ea0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
7eb0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
7ec0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7ed0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7ee0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7ef0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7f00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7f10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7f20: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7f30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7f40: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7f50: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7f60: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7f70: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
7f80: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
7f90: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7fa0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
7fb0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
7fc0: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
7fd0: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7fe0: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7ff0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8020: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
8030: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
8040: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
8050: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
8060: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
8070: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
8080: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
8090: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
80a0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
80b0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
80c0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
80d0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
80e0: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
80f0: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
8100: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8120: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
8130: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
8140: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
8150: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
8160: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
8170: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
8180: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
8190: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
81a0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
81b0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
81c0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
81d0: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
81e0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
81f0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
8200: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
8210: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
8220: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
8230: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
8240: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
8250: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
8260: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8270: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
8280: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
8290: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
82a0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
82b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
82c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
82d0: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
82e0: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
82f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8300: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
8310: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
8320: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
8330: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
8340: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
8350: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
8360: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
8370: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
8380: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
8390: 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  se, pMaskSet, pW
83a0: 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  C->wctrlFlags);.
83b0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72    whereSplit(pOr
83c0: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
83d0: 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  );.  exprAnalyze
83e0: 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29  All(pSrc, pOrWc)
83f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
8400: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
8410: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  n;.  assert( pOr
8420: 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a  Wc->nTerm>=2 );.
8430: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75  .  /*.  ** Compu
8440: 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  te the set of ta
8450: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
8460: 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20  satisfy cases 1 
8470: 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64  or 2..  */.  ind
8480: 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61  exable = ~(Bitma
8490: 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e  sk)0;.  chngToIN
84a0: 20 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29   = ~(pWC->vmask)
84b0: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
84c0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
84d0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
84e0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
84f0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8500: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
8510: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8520: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
8530: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
8540: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
8550: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8560: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30  rm->eOperator==0
8570: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8580: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
8590: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
85a0: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
85b0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
85c0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
85d0: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
85e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
85f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64  db, sizeof(*pAnd
8600: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
8610: 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20  ( pAndInfo ){.  
8620: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
8630: 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20  e *pAndWC;.     
8640: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
8650: 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  ndTerm;.        
8660: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42  int j;.        B
8670: 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20  itmask b = 0;.  
8680: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75        pOrTerm->u
8690: 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64  .pAndInfo = pAnd
86a0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f  Info;.        pO
86b0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
86c0: 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a  = TERM_ANDINFO;.
86d0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
86e0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
86f0: 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  AND;.        pAn
8700: 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d  dWC = &pAndInfo-
8710: 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65  >wc;.        whe
8720: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e  reClauseInit(pAn
8730: 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  dWC, pWC->pParse
8740: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
8750: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
8760: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
8770: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
8780: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
8790: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
87a0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
87b0: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
87c0: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
87d0: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
87e0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
87f0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8800: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8810: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8820: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8830: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
8840: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
8850: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
8860: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
8870: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
8880: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
8890: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
88a0: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
88b0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
88d0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
88e0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
88f0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8920: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
8930: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
8940: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8950: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8960: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
8970: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
8980: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8990: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
89a0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
89b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
89c0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
89d0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
89e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
89f0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
8a00: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
8a10: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8a20: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8a30: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8a40: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8a50: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
8a60: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
8a70: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
8a80: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
8a90: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
8aa0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
8ab0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
8ac0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
8ad0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
8ae0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
8af0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8b00: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
8b10: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8b20: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8b30: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8b40: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8b50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8b60: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
8b70: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8b80: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
8b90: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
8ba0: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
8bb0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
8bc0: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
8bd0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
8be0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
8bf0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
8c00: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
8c10: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
8c20: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
8c30: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
8c40: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
8c50: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
8c60: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
8c70: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
8c80: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
8c90: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
8ca0: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
8cb0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
8cc0: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
8cd0: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
8ce0: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
8cf0: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
8d00: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
8d10: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
8d20: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
8d30: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
8d40: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
8d50: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
8d60: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
8d70: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
8d80: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
8d90: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
8da0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
8db0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
8dc0: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
8dd0: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
8de0: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
8df0: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
8e00: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
8e10: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
8e20: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
8e30: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
8e40: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
8e50: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
8e60: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
8e70: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
8e80: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
8e90: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
8ea0: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
8eb0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
8ec0: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
8ed0: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
8ee0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
8ef0: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
8f00: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
8f10: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
8f20: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
8f30: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
8f40: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
8f50: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8f60: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8f70: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8f80: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8f90: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8fa0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8fb0: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8fc0: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8fd0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8fe0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8ff0: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
9000: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
9010: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
9020: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
9030: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
9040: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
9050: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
9060: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
9070: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
9080: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
9090: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
90a0: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
90b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
90c0: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
90d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
90e0: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
90f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
9100: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
9110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9120: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
9130: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
9140: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9160: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
9170: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
9180: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
9190: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
91a0: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
91b0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
91c0: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
91d0: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
91e0: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
91f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
9200: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
9210: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
9220: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
9230: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
9240: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
9250: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
9260: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
9270: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
9280: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
9290: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
92a0: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
92b0: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
92c0: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
92d0: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
92e0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
92f0: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
9300: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
9310: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
9320: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
9330: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
9340: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
9350: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9360: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
9370: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
9380: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
9390: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
93a0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
93b0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
93c0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
93d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
93e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
93f0: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
9400: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
9410: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
9420: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
9430: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
9440: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
9450: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
9460: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
9470: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9480: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
9490: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
94a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
94b0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
94c0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
94d0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
94e0: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
94f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
9500: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
9510: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
9520: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
9530: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
9540: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
9550: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
9560: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
9570: 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65   either preceede
9580: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
9590: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
95a0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
95b0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
95c0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
95d0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
95e0: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
95f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
9600: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9610: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9620: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9630: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9640: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9650: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9660: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9670: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
9680: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
9690: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
96a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
96b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
96c0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
96d0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
96e0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
96f0: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
9700: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9710: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9730: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9740: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9750: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9760: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9770: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
9780: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
9790: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
97a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
97b0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
97c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 63 68       assert( (ch
97d0: 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e  ngToIN&(chngToIN
97e0: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
97f0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
9800: 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61  oIN==getMask(pMa
9810: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
9820: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9840: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
9850: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
9860: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
9870: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
9880: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
9890: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
98a0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
98b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
98c0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
98d0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
98e0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
98f0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
9900: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
9910: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
9920: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9940: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9950: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9960: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
9970: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
9980: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
9990: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
99a0: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
99b0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
99c0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
99d0: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
99e0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
99f0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9a00: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9a20: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
9a30: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
9a40: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
9a50: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
9a60: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
9a70: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
9a80: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
9a90: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
9aa0: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
9ab0: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
9ac0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
9ad0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
9ae0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
9af0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
9b00: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
9b10: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
9b20: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9b30: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
9b40: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9b50: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
9b60: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
9b70: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
9b80: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9b90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
9ba0: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
9bb0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
9bc0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
9bd0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
9be0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
9bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9c00: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9c10: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
9c20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9c40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9c50: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
9c60: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
9c70: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
9c80: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
9c90: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
9ca0: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
9cb0: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
9cc0: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
9cd0: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
9ce0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
9cf0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
9d00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52   **.    ** EV: R
9d10: 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20  -00211-15100.   
9d20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
9d30: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
9d40: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
9d60: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
9d70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
9d80: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
9d90: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
9da0: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
9db0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
9dc0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
9dd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
9de0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
9df0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9e00: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9e20: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
9e30: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
9e40: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
9e50: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
9e60: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
9e70: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
9e80: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
9e90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9ea0: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
9eb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9ec0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9ed0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
9ee0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
9ef0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
9f00: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
9f10: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
9f20: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
9f30: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
9f40: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
9f50: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9f60: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9f70: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9f80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9f90: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9fa0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
9fb0: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9fc0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9fd0: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9fe0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
a010: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
a020: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a030: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a040: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
a050: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a060: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
a070: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
a080: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
a090: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
a0a0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
a0b0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
a0c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a0d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a0e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
a0f0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
a100: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a110: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
a120: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
a130: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
a140: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
a150: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
a160: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
a170: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
a180: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
a190: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
a1a0: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
a1b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
a1c0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
a1d0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
a1e0: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
a1f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
a200: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
a210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a230: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
a240: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
a250: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a260: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
a270: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
a280: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
a290: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
a2a0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
a2b0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
a2c0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
a2d0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f  _SUBQUERY */.../
a2e0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
a2f0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
a300: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
a310: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
a320: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
a330: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
a340: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
a350: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
a360: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
a370: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
a380: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
a390: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
a3a0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
a3b0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
a3c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a3d0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a3e0: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
a3f0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
a400: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
a410: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
a420: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
a430: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
a440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a450: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
a460: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
a470: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
a480: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
a490: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
a4a0: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
a4b0: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
a4c0: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
a4d0: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
a4e0: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
a4f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a500: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
a510: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
a520: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a530: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a540: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
a550: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
a560: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a570: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
a580: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
a590: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
a5a0: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
a5b0: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
a5c0: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
a5d0: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
a5e0: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
a5f0: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
a600: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a610: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
a620: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
a630: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
a640: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
a650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
a660: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
a670: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
a680: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
a690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a6a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
a6b0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a6c0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
a6d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a6e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
a6f0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
a700: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
a710: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a720: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
a730: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a750: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
a760: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68  analyzed */.  Wh
a770: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
a780: 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  kSet;          /
a790: 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69  * Set of table i
a7a0: 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  ndex masks */.  
a7b0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
a7e0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
a7f0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
a800: 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20  rereqLeft;      
a810: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a820: 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20  quesites of the 
a830: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a  pExpr->pLeft */.
a840: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
a850: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
a860: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
a870: 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  tes of pExpr */.
a880: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52    Bitmask extraR
a890: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ight = 0;       
a8a0: 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65     /* Extra depe
a8b0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54  ndencies on LEFT
a8c0: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20   JOIN */.  Expr 
a8d0: 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20  *pStr1 = 0;     
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a8f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a900: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
a910: 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  t isComplete = 0
a920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a930: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
a940: 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c  OB ends with wil
a950: 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  dcard */.  int n
a960: 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  oCase = 0;      
a970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a980: 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67  IKE/GLOB disting
a990: 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20  uishes case */. 
a9a0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
a9d0: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
a9e0: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
a9f0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
aa00: 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72  arse;     /* Par
aa10: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
aa20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
aa30: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
aa40: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
aa50: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
aa60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
aa70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
aa80: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
aa90: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aaa0: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
aab0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
aac0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
aad0: 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71  >pExpr;.  prereq
aae0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
aaf0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ab00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ab10: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
ab20: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
ab30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ab40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
ab50: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
ab60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ab70: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
ab80: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
ab90: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
aba0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
abb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
abc0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
abd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
abe0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
abf0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
ac00: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ac10: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
ac20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
ac30: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
ac40: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
ac50: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ac60: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
ac70: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
ac80: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
ac90: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
aca0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
acb0: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
acc0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
acd0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
ace0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
acf0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ad00: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
ad10: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
ad20: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
ad30: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
ad40: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
ad50: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
ad60: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
ad70: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
ad80: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
ad90: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
ada0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
adc0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
add0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
ade0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
adf0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
ae00: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
ae10: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
ae20: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
ae30: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
ae40: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
ae50: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
ae60: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
ae70: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
ae80: 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c  qRight & prereqL
ae90: 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  eft)==0 ){.    E
aea0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
aeb0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45  pr->pLeft;.    E
aec0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
aed0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
aee0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
aef0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
af00: 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75     pTerm->leftCu
af10: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
af20: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72  able;.      pTer
af30: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
af40: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
af50: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  ;.      pTerm->e
af60: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
af70: 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20  torMask(op);.   
af80: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
af90: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
afa0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
afb0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
afc0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
afd0: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
afe0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
aff0: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
b000: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b010: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
b020: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b030: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
b040: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
b050: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
b060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b070: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
b080: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b090: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
b0a0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
b0b0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b0c0: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
b0d0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b0e0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
b0f0: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
b100: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
b110: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
b120: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
b130: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
b140: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
b150: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b160: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
b170: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
b180: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
b190: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
b1a0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
b1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1c0: 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20   pDup = pExpr;. 
b1d0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
b1e0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
b1f0: 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70     exprCommute(p
b200: 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20  Parse, pDup);.  
b210: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70      pLeft = pDup
b220: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  ->pLeft;.      p
b230: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
b240: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
b250: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c  .      pNew->u.l
b260: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
b270: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
b280: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65    testcase( (pre
b290: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
b2a0: 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c  ight) != prereqL
b2b0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  eft );.      pNe
b2c0: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
b2d0: 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78   prereqLeft | ex
b2e0: 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20  traRight;.      
b2f0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
b300: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
b310: 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74     pNew->eOperat
b320: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
b330: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
b340: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
b350: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
b360: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
b370: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
b380: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
b390: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
b3a0: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
b3b0: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
b3c0: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
b3d0: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
b3e0: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46  N implements.  F
b3f0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
b400: 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54  .  **      a BET
b410: 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a  WEEN b AND c.  *
b420: 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72  *.  ** is conver
b430: 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  ted into:.  **. 
b440: 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57   **      (a BETW
b450: 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44  EEN b AND c) AND
b460: 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d   (a>=b) AND (a<=
b470: 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  c).  **.  ** The
b480: 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61   two new terms a
b490: 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  re added onto th
b4a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65  e end of the Whe
b4b0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e  reClause object.
b4c0: 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65  .  ** The new te
b4d0: 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63  rms are "dynamic
b4e0: 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72  " and are childr
b4f0: 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  en of the origin
b500: 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20  al BETWEEN.  ** 
b510: 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e  term.  That mean
b520: 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45  s that if the BE
b530: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f  TWEEN term is co
b540: 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65  ded, the childre
b550: 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70  n are.  ** skipp
b560: 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  ed.  Or, if the 
b570: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74  children are sat
b580: 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64  isfied by an ind
b590: 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ex, the original
b5a0: 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65  .  ** BETWEEN te
b5b0: 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  rm is skipped.. 
b5c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
b5d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
b5e0: 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d  WEEN && pWC->op=
b5f0: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
b600: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
b610: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
b620: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b630: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
b640: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
b650: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
b660: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
b670: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
b680: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
b690: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
b6a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
b6b0: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b6c0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b6d0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
b6e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b6f0: 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20  rse, ops[i], .  
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b720: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
b730: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a  xpr->pLeft, 0),.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b760: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b770: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
b780: 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  r, 0), 0);.     
b790: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b7a0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b7b0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
b7c0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b7d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
b7e0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
b7f0: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
b800: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b810: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
b820: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b830: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
b840: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
b850: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
b870: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
b880: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b890: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
b8a0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b8b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b8c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
b8d0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
b8e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
b900: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
b910: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
b920: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
b930: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
b940: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
b950: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
b960: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
b980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
b990: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
b9a0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
b9b0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
b9c0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
b9d0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b9e0: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
b9f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ba00: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ba10: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
ba20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
ba30: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
ba40: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
ba50: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
ba60: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
ba70: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
ba80: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
ba90: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
baa0: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
bab0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
bac0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
bad0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
bae0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
baf0: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
bb00: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
bb10: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
bb20: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
bb30: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
bb40: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
bb50: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
bb60: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
bb70: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
bb80: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
bb90: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
bba0: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
bbb0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
bbc0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
bbd0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
bbe0: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
bbf0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
bc00: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
bc10: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
bc20: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
bc30: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
bc40: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
bc50: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
bc60: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
bc70: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
bc80: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
bc90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
bca0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
bcb0: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
bcc0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
bcd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
bce0: 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  o use */..    pL
bcf0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
bd00: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
bd10: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
bd20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bd30: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
bd40: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
bd50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
bd60: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
bd70: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
bd80: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
bd90: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
bda0: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
bdb0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
bdc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
bdd0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
bde0: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
bdf0: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
be00: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
be10: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
be20: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
be30: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
be40: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
be50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
be60: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
be70: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
be80: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
be90: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
bea0: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
beb0: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
bec0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
bed0: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
bee0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
bef0: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
bf00: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
bf10: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
bf20: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
bf30: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
bf40: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
bf50: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
bf60: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
bf70: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
bf80: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
bf90: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
bfa0: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
bfb0: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
bfc0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
bfd0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
bfe0: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
bff0: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
c000: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
c010: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
c020: 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
c030: 55 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22  UTF8, noCase ? "
c040: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
c050: 59 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  Y",0);.    pNewE
c060: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
c070: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
c080: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
c090: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c0a0: 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69  ExprSetColl(sqli
c0b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
c0c0: 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a  eft,0), pColl),.
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
c0f0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
c100: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c110: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
c120: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
c130: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
c140: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
c150: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
c160: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
c170: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
c180: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
c190: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c1a0: 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c1c0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
c1d0: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
c1e0: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
c1f0: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
c200: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
c210: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
c220: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c230: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c240: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
c250: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
c260: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
c270: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
c280: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
c290: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
c2a0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c2b0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c2c0: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
c2d0: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
c2e0: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
c2f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c300: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
c310: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
c320: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
c330: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
c340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c350: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c360: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
c370: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
c380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c390: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
c3a0: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
c3b0: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
c3c0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
c3d0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
c3e0: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
c3f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
c400: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
c410: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
c420: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
c430: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
c440: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
c450: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
c460: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
c470: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
c480: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
c490: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
c4a0: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
c4b0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
c4c0: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
c4d0: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
c4e0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c4f0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
c500: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
c510: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
c520: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
c530: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
c540: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
c550: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
c560: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c570: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
c580: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
c590: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
c5a0: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
c5b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
c5c0: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
c5d0: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
c5e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c5f0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
c600: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
c610: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
c620: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
c630: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
c640: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
c650: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c660: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
c670: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
c6a0: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
c6b0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
c6c0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c6d0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c6e0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
c6f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c700: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c710: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
c720: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
c730: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
c740: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c750: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
c760: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
c770: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c780: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c790: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c7a0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c7b0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c7c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c7d0: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c7e0: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
c7f0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
c800: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
c810: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
c820: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c830: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
c840: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
c850: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c860: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
c870: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c880: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c890: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c8a0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
c8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
c8c0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
c8d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c8e0: 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20 57 68 65  E_STAT3.  /* Whe
c8f0: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
c900: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
c910: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
c920: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
c930: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
c940: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
c950: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
c960: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
c970: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
c980: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
c990: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c9a0: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
c9b0: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
c9c0: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
c9d0: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
c9e0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
c9f0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
ca00: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
ca10: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
ca20: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
ca30: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
ca40: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
ca50: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
ca60: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
ca70: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
ca80: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
ca90: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
caa0: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
cab0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
cac0: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
cad0: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
cae0: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
caf0: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
cb00: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
cb10: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
cb20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
cb30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
cb40: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
cb50: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a  iColumn>=0.  ){.
cb60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
cb70: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
cb80: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
cb90: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
cba0: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
cbb0: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
cbc0: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
cbd0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cbe0: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cc10: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
cc20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cc40: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
cc50: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
cc60: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
cc70: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
cc80: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
cc90: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
ccc0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ccd0: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
cce0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
ccf0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
cd00: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
cd10: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
cd20: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
cd30: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
cd40: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
cd50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
cd60: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
cd70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
cd80: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
cd90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
cda0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
cdb0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cdc0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
cdd0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
cde0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
cdf0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
ce00: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ce10: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
ce20: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
ce30: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
ce40: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
ce50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
ce60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ce70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
ce80: 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a  LE_STAT */..  /*
ce90: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
cea0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
ceb0: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
cec0: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
ced0: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
cee0: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
cef0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
cf00: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
cf10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
cf20: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
cf30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
cf40: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
cf50: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
cf60: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
cf70: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
cf80: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
cf90: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
cfa0: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
cfb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cfc0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
cfd0: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
cfe0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cff0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
d000: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
d010: 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  list */.  WhereM
d020: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
d030: 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  ,   /* Mapping f
d040: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
d050: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
d060: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
d070: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
d080: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
d090: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
d0a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
d0b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
d0c0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
d0d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
d0e0: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
d0f0: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
d100: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
d110: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
d120: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
d130: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
d140: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
d150: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
d160: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
d170: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
d180: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
d190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
d1a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d1b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d1c0: 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20 65  n searches the e
d1d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d1e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d1f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
d200: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
d210: 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c  n of type TK_COL
d220: 55 4d 4e 20 74 68 61 74 20 72 65 66 65 72 73 20  UMN that refers 
d230: 74 6f 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  to the same colu
d240: 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74  mn and.** uses t
d250: 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f  he same collatio
d260: 6e 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68  n sequence as th
d270: 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e  e iCol'th column
d280: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
d290: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73  ** Argument iBas
d2a0: 65 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  e is the cursor 
d2b0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
d2c0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70  the table that p
d2d0: 49 64 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f  Idx refers.** to
d2e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
d2f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
d300: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
d310: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
d320: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
d330: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
d340: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
d350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d360: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
d370: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
d380: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d390: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d3a0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
d3b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
d3e0: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
d3f0: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
d420: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
d430: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
d440: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d460: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
d470: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
d480: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
d4b0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
d4c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
d4d0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
d4e0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
d4f0: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
d500: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d510: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d520: 2a 70 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  *p = pList->a[i]
d530: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d540: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d550: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
d560: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
d570: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
d580: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
d590: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
d5a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
d5b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d5c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
d5d0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
d5e0: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
d5f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
d600: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
d610: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
d620: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
d630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d640: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
d650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74  This routine det
d660: 65 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20  ermines if pIdx 
d670: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
d680: 73 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73  ssist in process
d690: 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43  ing a.** DISTINC
d6a0: 54 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20  T qualifier. In 
d6b0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
d6c0: 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72  tests whether or
d6d0: 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a   not using this.
d6e0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
d6f0: 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72   outer loop guar
d700: 61 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73  antees that rows
d710: 20 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75   with equal valu
d720: 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78  es for.** all ex
d730: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
d740: 20 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20   pDistinct list 
d750: 61 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72  are delivered gr
d760: 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a  ouped together..
d770: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
d780: 65 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a  e, the query .**
d790: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53  .**   SELECT DIS
d7a0: 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52  TINCT a, b, c FR
d7b0: 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
d7c0: 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e   ?.**.** can ben
d7d0: 65 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e  efit from any in
d7e0: 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22  dex on columns "
d7f0: 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73  b" and "c"..*/.s
d800: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
d810: 69 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72  inctIndex(.  Par
d820: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d840: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d850: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
d860: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
d870: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
d880: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  E clause */.  In
d890: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8b0: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
d8c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20   considered */. 
d8d0: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
d900: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
d910: 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20  pIdx is on */.  
d920: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
d930: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  nct,            
d940: 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
d950: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  expressions */. 
d960: 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20   int nEqCol     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
d990: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
d9a0: 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d   == */.){.  Bitm
d9b0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20  ask mask = 0;   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d9d0: 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74  ask of unaccount
d9e0: 65 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74  ed for pDistinct
d9f0: 20 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20   exprs */.  int 
da00: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
da10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
da20: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
da30: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d   */..  if( pIdx-
da40: 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69  >zName==0 || pDi
da50: 73 74 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69  stinct==0 || pDi
da60: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42  stinct->nExpr>=B
da70: 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MS ) return 0;. 
da80: 20 74 65 73 74 63 61 73 65 28 20 70 44 69 73 74   testcase( pDist
da90: 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53  inct->nExpr==BMS
daa0: 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  -1 );..  /* Loop
dab0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
dac0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
dad0: 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73  the distinct lis
dae0: 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  t. If any of the
daf0: 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73  m.  ** are not s
db00: 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66  imple column ref
db10: 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20  erences, return 
db20: 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65  early. Otherwise
db30: 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a 20 20  , test if the.  
db40: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
db50: 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d  contains a "col=
db60: 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74  X" clause. If it
db70: 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65   does, the expre
db80: 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62  ssion.  ** can b
db90: 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74  e ignored. If it
dba0: 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74   does not, and t
dbb0: 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e  he column does n
dbc0: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65  ot belong to the
dbd0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
dbe0: 20 61 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20   as index pIdx, 
dbf0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69  return early. Fi
dc00: 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20  nally, if there 
dc10: 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  is no.  ** match
dc20: 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72  ing "col=X" expr
dc30: 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63  ession and the c
dc40: 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20  olumn is on the 
dc50: 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49  same table as pI
dc60: 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  dx,.  ** set the
dc70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
dc80: 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d  it in variable m
dc90: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ask..  */.  for(
dca0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
dcb0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
dcc0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
dcd0: 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  erm;.    Expr *p
dce0: 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b   = pDistinct->a[
dcf0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
dd00: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
dd10: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
dd20: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
dd30: 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62  erm(pWC, p->iTab
dd40: 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  le, p->iColumn, 
dd50: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
dd60: 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  EQ, 0);.    if( 
dd70: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45  pTerm ){.      E
dd80: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
dd90: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
dda0: 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69  llSeq *p1 = sqli
ddb0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
ddc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ddd0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
dde0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f  Right);.      Co
ddf0: 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69  llSeq *p2 = sqli
de00: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
de10: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
de20: 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f   if( p1==p2 ) co
de30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
de40: 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21    if( p->iTable!
de50: 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e 20 30  =base ) return 0
de60: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28  ;.    mask |= ((
de70: 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69  (Bitmask)1) << i
de80: 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  );.  }..  for(i=
de90: 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20  nEqCol; mask && 
dea0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
deb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
dec0: 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78  Expr = findIndex
ded0: 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73  Col(pParse, pDis
dee0: 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64  tinct, base, pId
def0: 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69  x, i);.    if( i
df00: 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a  Expr<0 ) break;.
df10: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28      mask &= ~(((
df20: 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45  Bitmask)1) << iE
df30: 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  xpr);.  }..  ret
df40: 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d  urn (mask==0);.}
df50: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
df60: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
df70: 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
df80: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
df90: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
dfa0: 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
dfb0: 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  t. A DISTINCT li
dfc0: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
dfd0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
dfe0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e  contains a.** UN
dff0: 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74 20  IQUE index that 
e000: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e010: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
e020: 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  e query will be 
e030: 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77  distinct.** anyw
e040: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
e050: 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
e060: 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
e070: 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73  pParse,.  SrcLis
e080: 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57  t *pTabList,.  W
e090: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
e0a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
e0b0: 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c  stinct.){.  Tabl
e0c0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
e0d0: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
e100: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
e110: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
e120: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
e130: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
e140: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
e150: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
e160: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
e170: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
e180: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
e190: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
e1a0: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
e1b0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
e1c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
e1d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
e1e0: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
e1f0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
e200: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
e210: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
e220: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
e230: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
e240: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
e250: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
e260: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
e270: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
e280: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
e290: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
e2a0: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
e2b0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
e2c0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
e2d0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
e2e0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
e2f0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
e300: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
e310: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
e320: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
e330: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
e340: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e350: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
e360: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
e370: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
e390: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
e3a0: 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
e3b0: 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
e3c0: 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
e3d0: 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
e3e0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
e3f0: 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
e400: 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
e410: 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
e420: 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
e430: 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
e440: 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
e450: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
e460: 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
e470: 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
e480: 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
e490: 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
e4a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
e4b0: 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
e4c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
e4d0: 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
e4e0: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
e4f0: 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
e500: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e510: 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
e520: 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
e530: 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
e540: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
e550: 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
e560: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  he index..  */. 
e570: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e580: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e590: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e5a0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f  .    if( pIdx->o
e5b0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
e5c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e5d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
e5e0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
e5f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e600: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e610: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i];.      if( 0=
e620: 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  =findTerm(pWC, i
e630: 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69  Base, iCol, ~(Bi
e640: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
e650: 70 49 64 78 29 20 0a 20 20 20 20 20 20 20 26 26  pIdx) .       &&
e660: 20 30 3e 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   0>findIndexCol(
e670: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
e680: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
e690: 69 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  i).      ){.    
e6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e6b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e6c0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
e6d0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
e6e0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
e6f0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
e700: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
e710: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
e720: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
e740: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
e750: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
e760: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
e770: 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
e780: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
e790: 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74  * clause.  If it
e7a0: 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73   can, it returns
e7b0: 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e   1.  If pIdx can
e7c0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a  not satisfy the.
e7d0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
e7e0: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
e7f0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
e800: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
e810: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e820: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
e830: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
e840: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
e850: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
e860: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e870: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
e880: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
e890: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
e8a0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
e8b0: 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
e8c0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
e8d0: 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43  pTab..**.** nEqC
e8e0: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
e8f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70   of columns of p
e900: 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65  Idx that are use
e910: 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a  d as equality.**
e920: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41   constraints.  A
e930: 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75  ny of these colu
e940: 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69  mns may be missi
e950: 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  ng from the ORDE
e960: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61  R BY.** clause a
e970: 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
e980: 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
e990: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
e9a0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
e9b0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
e9c0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
e9d0: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
e9e0: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
e9f0: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
ea00: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ea10: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
ea20: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
ea30: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
ea40: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
ea50: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
ea60: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
ea70: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
ea80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ea90: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
eaa0: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
eab0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
eac0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
ead0: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
eae0: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
eaf0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
eb00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
eb10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
eb20: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
eb30: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
eb40: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
eb50: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
eb60: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20  bers to bitmaps 
eb70: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
eb80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
eb90: 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
eba0: 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
ebb0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
ebc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
ebd0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
ebe0: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
ebf0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
ec00: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
ec10: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
ec20: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
ec30: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
ec40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ec50: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69  index columns wi
ec60: 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  th == constraint
ec70: 73 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61  s */.  int wsFla
ec80: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
ec90: 2a 20 49 6e 64 65 78 20 75 73 61 67 65 73 20 66  * Index usages f
eca0: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
ecb0: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
ecc0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
ecd0: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
ece0: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
ecf0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
ed00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ed10: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
ed20: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
ed30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ed40: 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20  /* XOR of index 
ed50: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72  and ORDER BY sor
ed60: 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  t direction */. 
ed70: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
eda0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
edb0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
edc0: 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20  t_item *pTerm;  
edd0: 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
ede0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
edf0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
ee00: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ee10: 3b 0a 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  ;..  if( !pOrder
ee20: 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  By ) return 0;. 
ee30: 20 69 66 28 20 77 73 46 6c 61 67 73 20 26 20 57   if( wsFlags & W
ee40: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
ee50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ee60: 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
ee70: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
ee80: 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42   nTerm = pOrderB
ee90: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  y->nExpr;.  asse
eea0: 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a  rt( nTerm>0 );..
eeb0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49    /* Argument pI
eec0: 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70  dx must either p
eed0: 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27  oint to a 'real'
eee0: 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72   named index str
eef0: 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72  ucture, .  ** or
ef00: 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   an index struct
ef10: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  ure allocated on
ef20: 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65   the stack by be
ef30: 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74  stBtreeIndex() t
ef40: 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74  o.  ** represent
ef50: 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78   the rowid index
ef60: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
ef70: 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a   every table.  *
ef80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
ef90: 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78  ->zName || (pIdx
efa0: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
efb0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
efc0: 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20  ]==-1) );..  /* 
efd0: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
efe0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
eff0: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
f000: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
f010: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
f020: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
f030: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
f040: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
f050: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
f060: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
f070: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
f080: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
f090: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
f0a0: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
f0b0: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
f0c0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
f0d0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
f0e0: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
f0f0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
f100: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
f110: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
f120: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
f130: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
f140: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
f150: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
f160: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
f170: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
f180: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
f190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
f1a0: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
f1b0: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
f1c0: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
f1d0: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
f1e0: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
f1f0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
f200: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
f210: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
f220: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
f230: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
f240: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
f250: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
f260: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
f270: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
f280: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
f290: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
f2a0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f2b0: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
f2c0: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
f2d0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
f2e0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
f2f0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
f300: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
f310: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
f320: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
f330: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
f340: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
f350: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
f360: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
f370: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
f380: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
f390: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
f3a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
f3b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
f3c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
f3d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
f3e0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
f3f0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
f400: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
f410: 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   if( pIdx->zName
f420: 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && i<pIdx->nCol
f430: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  umn ){.      iCo
f440: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43  lumn = pIdx->aiC
f450: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
f460: 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  if( iColumn==pId
f470: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
f480: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
f490: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
f4a0: 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  }.      iSortOrd
f4b0: 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
f4c0: 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  Order[i];.      
f4d0: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
f4e0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  Coll[i];.    }el
f4f0: 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  se{.      iColum
f500: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53  n = -1;.      iS
f510: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  ortOrder = 0;.  
f520: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c      zColl = pCol
f530: 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  l->zName;.    }.
f540: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
f550: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
f560: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
f570: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
f580: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
f590: 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65  /* Term j of the
f5a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f5b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f5c0: 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20  column i of the 
f5d0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
f5e0: 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i<nEqCol ){. 
f5f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
f600: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
f610: 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
f620: 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20   by == fails to 
f630: 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20  match an.       
f640: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
f650: 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20  m, that is OK.  
f660: 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74  Just ignore that
f670: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
f680: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ndex.        */.
f690: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f6a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f6b0: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( i==pIdx->nColu
f6c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mn ){.        /*
f6d0: 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20   Index column i 
f6e0: 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41  is the rowid.  A
f6f0: 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d  ll other terms m
f700: 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20  atch. */.       
f710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
f720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f730: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
f740: 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  mn fails to matc
f750: 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e  h and is not con
f760: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20  strained by ==. 
f770: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
f780: 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
f790: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
f7a0: 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e  R BY constraint.
f7b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f7c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f7e0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
f7f0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69  ortOrder!=0 || i
f800: 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20  Column==-1 );.  
f810: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
f820: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  >sortOrder==0 ||
f830: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
f840: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
f850: 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
f860: 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
f870: 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
f880: 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
f890: 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f  rder ^ pTerm->so
f8a0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
f8b0: 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i>nEqCol ){.   
f8c0: 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f     if( termSortO
f8d0: 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20  rder!=sortOrder 
f8e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
f8f0: 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62  dices can only b
f900: 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52  e used if all OR
f910: 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73  DER BY terms pas
f920: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
f930: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
f940: 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69  aints are all ei
f950: 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43  ther DESC or ASC
f960: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  . */.        ret
f970: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
f980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f990: 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d  sortOrder = term
f9a0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  SortOrder;.    }
f9b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54  .    j++;.    pT
f9c0: 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  erm++;.    if( i
f9d0: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66  Column<0 && !ref
f9e0: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
f9f0: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
fa00: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
fa10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
fa20: 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  he indexed colum
fa30: 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  n is the primary
fa40: 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74 68   key and everyth
fa50: 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20  ing matches.    
fa60: 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20    ** so far and 
fa70: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45  none of the ORDE
fa80: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68  R BY terms to th
fa90: 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e 63  e right referenc
faa0: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
fab0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
fac0: 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65  oin, then we are
fad0: 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74 68   assured that th
fae0: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
faf0: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  sed .      ** to
fb00: 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74 68   sort because th
fb10: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
fb20: 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e   unique and so n
fb30: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  one of the other
fb40: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
fb50: 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20  s will make any 
fb60: 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20  difference.     
fb70: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54   */.      j = nT
fb80: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  erm;.    }.  }..
fb90: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
fba0: 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a  rder!=0;.  if( j
fbb0: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f  >=nTerm ){.    /
fbc0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
fbd0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
fbe0: 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  se are covered b
fbf0: 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a  y this index so.
fc00: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65      ** this inde
fc10: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
fc20: 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  r sorting. */.  
fc30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
fc40: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
fc50: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
fc60: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
fc70: 0a 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61  .      && (wsFla
fc80: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
fc90: 4e 5f 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  N_NULL)==0.     
fca0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
fcb0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
fcc0: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
fcd0: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
fce0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
fcf0: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
fd00: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
fd10: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
fd20: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
fd30: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
fd40: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
fd50: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
fd60: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
fd70: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
fd80: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
fd90: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
fda0: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
fdb0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
fdc0: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
fdd0: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
fde0: 20 4e 6f 74 20 74 68 61 74 20 69 66 20 74 68 65   Not that if the
fdf0: 20 6d 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a   matching.    **
fe00: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53   condition is IS
fe10: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
fe20: 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63  esult is not nec
fe30: 65 73 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a  essarily unique.
fe40: 20 20 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61      ** even on a
fe50: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73   UNIQUE index, s
fe60: 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65  o disallow those
fe70: 20 63 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72   cases. */.    r
fe80: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
fe90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fea0: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
feb0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
fec0: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
fed0: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
fee0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
fef0: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
ff00: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
ff10: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
ff20: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
ff30: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
ff40: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ing operations w
ff50: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
ff60: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
ff70: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
ff80: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
ff90: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
ffa0: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
ffb0: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
ffc0: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
ffd0: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
ffe0: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
fff0: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
10000 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
10010 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
10020 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
10030 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
10040 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
10050 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
10060 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
10070 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
10080 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10090 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
100a0 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
100b0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
100c0 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
100d0 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
100e0 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
100f0 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
10100 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
10110 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
10120 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
10130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10140 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
10150 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
10160 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
10170 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
10180 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
10190 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
101a0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
101b0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
101c0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
101d0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
101e0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
101f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10200 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
10210 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
10220 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
10230 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
10240 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
10250 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
10260 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
10270 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
10280 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
10290 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
102a0 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
102b0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
102c0 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
102d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
102e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
102f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
10300 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
10310 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
10320 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
10330 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
10340 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
10350 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
10360 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
10370 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
10380 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
10390 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
103a0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
103b0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
103c0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
103d0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
103e0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
103f0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
10400 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10410 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
10420 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
10430 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
10440 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
10450 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
10460 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
10470 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
10480 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
10490 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
104a0 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
104b0 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
104c0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
104d0 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
104e0 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
104f0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
10500 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
10510 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
10520 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
10530 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
10540 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10550 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
10560 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
10570 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
10580 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
10590 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
105a0 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
105b0 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
105c0 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72  f../* .** Requir
105d0 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49  ed because bestI
105e0 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
105f0 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65   by bestOrClause
10600 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74  Index() .*/.stat
10610 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
10620 78 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57  x(.    Parse*, W
10630 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72  hereClause*, str
10640 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10650 2a 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20  *,.    Bitmask, 
10660 42 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73  Bitmask, ExprLis
10670 74 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b  t*, WhereCost*);
10680 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10690 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
106a0 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
106b0 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
106c0 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
106d0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
106e0 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
106f0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
10700 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
10710 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10720 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10730 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10740 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
10750 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
10760 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
10770 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10790 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
107a0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
107b0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
107c0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
107d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
107e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
107f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10800 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10810 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
10820 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
10830 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
10840 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
10850 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
10860 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
10870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
10880 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
10890 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
108a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
108b0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
108c0 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
108d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
108e0 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
108f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10900 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
10910 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10920 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
10930 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
10940 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
10950 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
10960 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10970 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
10980 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69  ZATION.  const i
10990 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
109a0 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
109b0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
109c0 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
109d0 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
109e0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20  Bitmask maskSrc 
109f0 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
10a00 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20  MaskSet, iCur); 
10a10 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20   /* Bitmask for 
10a20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54  pSrc */.  WhereT
10a30 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45  erm * const pWCE
10a40 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
10a50 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20  ->nTerm];       
10a60 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
10a70 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
10a80 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
10a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10aa0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
10ab0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10ac0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d  */..  /* The OR-
10ad0 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74  clause optimizat
10ae0 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ion is disallowe
10af0 64 20 69 66 20 74 68 65 20 49 4e 44 45 58 45 44  d if the INDEXED
10b00 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20   BY or.  ** NOT 
10b10 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73 20  INDEXED clauses 
10b20 61 72 65 20 75 73 65 64 20 6f 72 20 69 66 20 74  are used or if t
10b30 68 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c  he WHERE_AND_ONL
10b40 59 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a 2f  Y bit is set. */
10b50 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
10b60 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d  Indexed || pSrc-
10b70 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  >pIndex!=0 ){.  
10b80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10b90 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  if( pWC->wctrlFl
10ba0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
10bb0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74 75  ONLY ){.    retu
10bc0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rn;.  }..  /* Se
10bd0 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20 63  arch the WHERE c
10be0 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 20  lause terms for 
10bf0 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74  a usable WO_OR t
10c00 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54  erm. */.  for(pT
10c10 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
10c20 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
10c30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
10c40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
10c50 5f 4f 52 20 0a 20 20 20 20 20 26 26 20 28 28 70  _OR .     && ((p
10c60 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10c70 26 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f  & ~maskSrc) & no
10c80 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
10c90 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
10ca0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
10cb0 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
10cc0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
10cd0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
10ce0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
10cf0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
10d00 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
10d10 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
10d20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
10d30 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
10d40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
10d50 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
10d60 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
10d70 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
10d80 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
10d90 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
10da0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
10db0 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
10dc0 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
10dd0 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
10de0 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
10df0 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
10e00 20 20 57 68 65 72 65 43 6f 73 74 20 73 54 65 72    WhereCost sTer
10e10 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57  mCost;.        W
10e20 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10e30 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74  Multi-index OR t
10e40 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20  esting for term 
10e50 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c  %d of %d....\n",
10e60 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4f 72   .          (pOr
10e70 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29  Term - pOrWC->a)
10e80 2c 20 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e  , (pTerm - pWC->
10e90 61 29 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20  a).        ));. 
10ea0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
10eb0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
10ec0 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
10ed0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
10ee0 70 41 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72  pAndWC = &pOrTer
10ef0 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
10f00 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  c;.          bes
10f10 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
10f20 41 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  AndWC, pSrc, not
10f30 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
10f40 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
10f50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10f60 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
10f70 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
10f80 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
10f90 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
10fa0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10fb0 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
10fc0 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
10fd0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
10fe0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
10ff0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
11000 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
11010 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
11020 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
11030 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
11040 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
11050 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
11060 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
11070 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
11080 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72 63  e, &tempWC, pSrc
11090 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
110a0 61 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43  alid, 0, &sTermC
110b0 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ost);.        }e
110c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
110d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
110e0 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61   }.        rTota
110f0 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72  l += sTermCost.r
11100 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52  Cost;.        nR
11110 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e  ow += sTermCost.
11120 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  plan.nRow;.     
11130 20 20 20 75 73 65 64 20 7c 3d 20 73 54 65 72 6d     used |= sTerm
11140 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20  Cost.used;.     
11150 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70     if( rTotal>=p
11160 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72  Cost->rCost ) br
11170 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
11180 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11190 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
111a0 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20  lause, increase 
111b0 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f  the scan cost to
111c0 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20   account .      
111d0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20  ** for the cost 
111e0 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a  of the sort. */.
111f0 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
11200 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
11210 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
11220 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
11230 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67  ses OR cost %.9g
11240 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20   to %.9g\n",.   
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b   rTotal, rTotal+
11270 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
11280 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f  )));.        rTo
11290 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  tal += nRow*estL
112a0 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  og(nRow);.      
112b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
112c0 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e  he cost of scann
112d0 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f  ing using this O
112e0 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d  R term for optim
112f0 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  ization is.     
11300 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
11310 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73  e current cost s
11320 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20  tored in pCost, 
11330 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  replace the cont
11340 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ents.      ** of
11350 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20   pCost. */.     
11360 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
11370 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
11380 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
11390 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c  %.9g\n", rTotal,
113a0 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
113b0 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d  f( rTotal<pCost-
113c0 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  >rCost ){.      
113d0 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
113e0 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
113f0 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75   pCost->used = u
11400 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  sed;.        pCo
11410 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  st->plan.nRow = 
11420 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43  nRow;.        pC
11430 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
11440 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  s = flags;.     
11450 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
11460 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a  .pTerm = pTerm;.
11470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11480 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11490 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
114a0 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69  IZATION */.}..#i
114b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
114c0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
114d0 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  X./*.** Return T
114e0 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45  RUE if the WHERE
114f0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65   clause term pTe
11500 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20  rm is of a form 
11510 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c  where it.** coul
11520 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  d be used with a
11530 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73  n index to acces
11540 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67  s pSrc, assuming
11550 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
11560 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64  ** index existed
11570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11580 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
11590 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  x(.  WhereTerm *
115a0 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  pTerm,          
115b0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
115c0 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63  use term to chec
115d0 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  k */.  struct Sr
115e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
115f0 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77  ,     /* Table w
11600 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
11610 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d  access */.  Bitm
11620 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20  ask notReady    
11630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
11640 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f  bles in outer lo
11650 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ops of the join 
11660 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66  */.){.  char aff
11670 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c  ;.  if( pTerm->l
11680 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d  eftCursor!=pSrc-
11690 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >iCursor ) retur
116a0 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  n 0;.  if( pTerm
116b0 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
116c0 45 51 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  EQ ) return 0;. 
116d0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
116e0 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
116f0 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
11700 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63   0;.  aff = pSrc
11710 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65  ->pTab->aCol[pTe
11720 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
11730 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66  ].affinity;.  if
11740 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
11750 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d  ffinityOk(pTerm-
11760 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72  >pExpr, aff) ) r
11770 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
11780 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 1;.}.#endif..#
11790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
117a0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
117b0 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  EX./*.** If the 
117c0 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70  query plan for p
117d0 53 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e  Src specified in
117e0 20 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c   pCost is a full
117f0 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61   table scan.** a
11800 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61  nd indexing is a
11810 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20  llows (if there 
11820 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45  is no NOT INDEXE
11830 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74  D clause) and it
11840 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
11850 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e  construct a tran
11860 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74  sient index that
11870 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62   would perform b
11880 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20  etter.** than a 
11890 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
118a0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f  even when the co
118b0 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69  st of constructi
118c0 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
118d0 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63  is taken into ac
118e0 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65  count, then alte
118f0 72 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  r the query plan
11900 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74   to use the.** t
11910 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a  ransient index..
11920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
11930 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  estAutomaticInde
11940 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
11950 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
11960 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
11970 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
11980 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
11990 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
119a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
119b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
119c0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
119d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
119e0 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
119f0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
11a00 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
11a10 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
11a20 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
11a30 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
11a40 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
11a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11a60 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
11a70 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f   plan */.){.  do
11a80 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20  uble nTableRow; 
11a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
11aa0 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74  s in the input t
11ab0 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  able */.  double
11ac0 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20   logN;          
11ad0 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61        /* log(nTa
11ae0 62 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75  bleRow) */.  dou
11af0 62 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b  ble costTempIdx;
11b00 20 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d           /* per-
11b10 71 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68  query cost of th
11b20 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  e transient inde
11b30 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  x */.  WhereTerm
11b40 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
11b50 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
11b60 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
11b70 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
11b80 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20  reTerm *pWCEnd; 
11b90 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
11ba0 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
11bb0 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bd0 54 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20  Table tht might 
11be0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20  be indexed */.. 
11bf0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75   if( pParse->nQu
11c00 65 72 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65  eryLoop<=(double
11c10 29 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  )1 ){.    /* The
11c20 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
11c30 6e 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  n building an au
11c40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f  tomatic index fo
11c50 72 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20  r a single scan 
11c60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11c70 20 7d 0a 20 20 69 66 28 20 28 70 50 61 72 73 65   }.  if( (pParse
11c80 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
11c90 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d  LITE_AutoIndex)=
11ca0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74  =0 ){.    /* Aut
11cb0 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 61  omatic indices a
11cc0 72 65 20 64 69 73 61 62 6c 65 64 20 61 74 20 72  re disabled at r
11cd0 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72  un-time */.    r
11ce0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
11cf0 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
11d00 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
11d10 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29  T_FULLSCAN)!=0 )
11d20 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65  {.    /* We alre
11d30 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69  ady have some ki
11d40 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75  nd of index in u
11d50 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  se for this quer
11d60 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
11d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
11d80 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
11d90 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49      /* The NOT I
11da0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70  NDEXED clause ap
11db0 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c  pears in the SQL
11dc0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11dd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11de0 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b  >isCorrelated ){
11df0 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72  .    /* The sour
11e00 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  ce is a correlat
11e10 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f  ed sub-query. No
11e20 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69   point in indexi
11e30 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  ng it. */.    re
11e40 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  turn;.  }..  ass
11e50 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ert( pParse->nQu
11e60 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62  eryLoop >= (doub
11e70 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65  le)1 );.  pTable
11e80 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
11e90 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61   nTableRow = pTa
11ea0 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
11eb0 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54  logN = estLog(nT
11ec0 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74  ableRow);.  cost
11ed0 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e  TempIdx = 2*logN
11ee0 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72  *(nTableRow/pPar
11ef0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b  se->nQueryLoop +
11f00 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54   1);.  if( costT
11f10 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72  empIdx>=pCost->r
11f20 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Cost ){.    /* T
11f30 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74  he cost of creat
11f40 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
11f50 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65  t table would be
11f60 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20   greater than.  
11f70 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66    ** doing the f
11f80 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
11f90 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11fa0 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
11fb0 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20  or any equality 
11fc0 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20  comparison term 
11fd0 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  */.  pWCEnd = &p
11fe0 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
11ff0 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ];.  for(pTerm=p
12000 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12010 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12020 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12030 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
12040 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
12050 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
12060 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78  ACE(("auto-index
12070 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66 72   reduces cost fr
12080 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c  om %.1f to %.1f\
12090 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
120a0 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72          pCost->r
120b0 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64  Cost, costTempId
120c0 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  x));.      pCost
120d0 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65  ->rCost = costTe
120e0 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f  mpIdx;.      pCo
120f0 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  st->plan.nRow = 
12100 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20  logN + 1;.      
12110 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
12120 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50  ags = WHERE_TEMP
12130 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 43  _INDEX;.      pC
12140 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65 72  ost->used = pTer
12150 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
12160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12170 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
12180 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f   define bestAuto
12190 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c 43  maticIndex(A,B,C
121a0 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,D,E)  /* no-op 
121b0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
121c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
121d0 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69  IC_INDEX */...#i
121e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
121f0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
12200 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
12210 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
12220 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
12230 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
12240 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
12250 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
12260 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
12270 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
12280 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
12290 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
122a0 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
122b0 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
122c0 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
122d0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
122e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
122f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
12300 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
12310 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
12320 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
12330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
12340 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12350 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
12360 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
12370 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
12380 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
12390 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
123a0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
123b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
123c0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
123d0 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
123e0 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
123f0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
12400 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
12410 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
12420 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  .){.  int nColum
12430 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12440 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
12450 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
12460 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
12470 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
12480 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
12490 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
124a0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
124b0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
124c0 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
124d0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
124e0 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69   pWC->a[] */.  i
124f0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
12500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12510 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  te of memory nee
12520 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ded for pIdx */.
12530 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12550 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
12560 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
12570 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
12580 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12590 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
125a0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
125b0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
125c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 73 49   */.  int regIsI
125d0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
125e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 65    /* Register se
125f0 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  t by initializat
12600 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
12610 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
12620 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12630 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
12640 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
12650 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
12660 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
12670 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
12680 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
12690 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
126a0 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  info;          /
126b0 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
126c0 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  n for the index 
126d0 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72  */   .  int addr
126e0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
126f0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
12700 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
12710 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
12720 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
12730 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
12740 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
12750 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
12760 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
12770 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
12780 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
12790 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
127a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
127b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
127c0 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
127d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
127e0 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
127f0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
12800 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
12810 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
12820 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
12830 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
12840 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  lumn */.  Bitmas
12850 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20  k idxCols;      
12860 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
12870 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20  of columns used 
12880 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
12890 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43    Bitmask extraC
128a0 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ols;          /*
128b0 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74   Bitmap of addit
128c0 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ional columns */
128d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
128e0 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  code to skip ove
128f0 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61  r the creation a
12900 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nd initializatio
12910 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72  n of the.  ** tr
12920 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e  ansient index on
12930 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
12940 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f  ent iterations o
12950 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  f the loop. */. 
12960 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
12970 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
12980 3d 30 20 29 3b 0a 20 20 72 65 67 49 73 49 6e 69  =0 );.  regIsIni
12990 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
129a0 65 6d 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d  em;.  addrInit =
129b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
129c0 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 72  p1(v, OP_Once, r
129d0 65 67 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a  egIsInit);..  /*
129e0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
129f0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
12a00 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
12a10 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
12a20 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
12a30 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
12a40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
12a50 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
12a60 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
12a70 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
12a80 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
12a90 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20  erm];.  idxCols 
12aa0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
12ab0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
12ac0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
12ad0 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
12ae0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
12af0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
12b00 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
12b10 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
12b20 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
12b30 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
12b40 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
12b50 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
12b60 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
12b70 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74  )<<iCol;.      t
12b80 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
12b90 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
12ba0 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
12bb0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  1 );.      if( (
12bc0 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
12bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ==0 ){.        n
12be0 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
12bf0 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
12c00 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
12c10 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
12c20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70  nColumn>0 );.  p
12c30 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20  Level->plan.nEq 
12c40 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a  = nColumn;..  /*
12c50 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
12c60 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
12c70 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
12c80 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
12c90 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
12ca0 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
12cb0 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
12cc0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
12cd0 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
12ce0 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
12cf0 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
12d00 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
12d10 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
12d20 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
12d30 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
12d40 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
12d50 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
12d60 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
12d70 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
12d80 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
12d90 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
12da0 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
12db0 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
12dc0 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
12dd0 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
12de0 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
12df0 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
12e00 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
12e10 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
12e20 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
12e30 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69  ~idxCols | (((Bi
12e40 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
12e50 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20  )));.  mxBitCol 
12e60 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  = (pTable->nCol 
12e70 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d  >= BMS-1) ? BMS-
12e80 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  1 : pTable->nCol
12e90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
12ea0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
12eb0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
12ec0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
12ed0 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d  MS-2 );.  for(i=
12ee0 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
12ef0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
12f00 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d  raCols & (((Bitm
12f10 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f  ask)1)<<i) ) nCo
12f20 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  lumn++;.  }.  if
12f30 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
12f40 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
12f50 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
12f60 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62   nColumn += pTab
12f70 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b  le->nCol - BMS +
12f80 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c   1;.  }.  pLevel
12f90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
12fa0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
12fb0 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
12fc0 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f  LY | WO_EQ;..  /
12fd0 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
12fe0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
12ff0 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e  describe this in
13000 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d  dex */.  nByte =
13010 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a   sizeof(Index);.
13020 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
13030 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20  mn*sizeof(int); 
13040 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
13050 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65  olumn */.  nByte
13060 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
13070 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20  of(char*);   /* 
13080 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a  Index.azColl */.
13090 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75    nByte += nColu
130a0 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
130b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
130c0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64  rtOrder */.  pId
130d0 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  x = sqlite3DbMal
130e0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
130f0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
13100 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
13110 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c  rn;.  pLevel->pl
13120 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78  an.u.pIdx = pIdx
13130 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
13140 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
13150 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
13160 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
13170 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
13180 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
13190 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
131a0 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
131b0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
131c0 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
131d0 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
131e0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
131f0 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
13200 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
13210 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
13220 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
13230 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
13240 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
13250 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
13260 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
13270 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
13280 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
13290 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
132a0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
132b0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
132c0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
132d0 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
132e0 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
132f0 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  <<iCol;.      if
13300 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
13310 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
13320 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
13330 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
13340 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
13350 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
13360 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13370 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
13380 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
13390 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
133a0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
133b0 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
133c0 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
133d0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
133e0 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
133f0 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
13400 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
13410 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
13420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13430 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
13440 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c  32)n==pLevel->pl
13450 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  an.nEq );..  /* 
13460 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  Add additional c
13470 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
13480 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61   make the automa
13490 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20  tic index into. 
134a0 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69   ** a covering i
134b0 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ndex */.  for(i=
134c0 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69  0; i<mxBitCol; i
134d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74  ++){.    if( ext
134e0 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d  raCols & (((Bitm
134f0 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20  ask)1)<<i) ){.  
13500 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
13510 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
13520 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
13530 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
13540 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
13550 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
13560 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61  lUsed & (((Bitma
13570 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
13580 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53  ){.    for(i=BMS
13590 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  -1; i<pTable->nC
135a0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
135b0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
135c0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  ] = i;.      pId
135d0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
135e0 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e  BINARY";.      n
135f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
13600 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75  assert( n==nColu
13610 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  mn );..  /* Crea
13620 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  te the automatic
13630 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79   index */.  pKey
13640 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  info = sqlite3In
13650 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
13660 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65  e, pIdx);.  asse
13670 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt( pLevel->iIdx
13680 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Cur>=0 );.  sqli
13690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
136a0 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
136b0 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
136c0 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30  ur, nColumn+1, 0
136d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
136e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
136f0 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yinfo, P4_KEYINF
13700 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64  O_HANDOFF);.  Vd
13710 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
13720 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
13730 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
13740 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
13750 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
13760 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f  tent */.  addrTo
13770 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
13780 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
13790 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  nd, pLevel->iTab
137a0 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  Cur);.  regRecor
137b0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
137c0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
137d0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
137e0 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
137f0 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69   pIdx, pLevel->i
13800 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72  TabCur, regRecor
13810 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 1);.  sqlite3
13820 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13830 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
13840 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
13850 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
13860 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
13870 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
13880 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
13890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
138a0 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d  OP_Next, pLevel-
138b0 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f  >iTabCur, addrTo
138c0 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  p+1);.  sqlite3V
138d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
138e0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
138f0 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73  _AUTOINDEX);.  s
13900 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13910 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  re(v, addrTop);.
13920 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13930 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
13940 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20  regRecord);.  . 
13950 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
13960 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  en skipping the 
13970 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
13980 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
13990 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
139a0 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  nit);.}.#endif /
139b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
139c0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f  TOMATIC_INDEX */
139d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
139e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
139f0 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  LE./*.** Allocat
13a00 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
13a10 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
13a20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
13a30 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
13a40 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
13a50 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
13a60 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
13a70 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a   the structure.*
13a80 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65  * by passing the
13a90 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
13aa0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
13ab0 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72  on to sqlite3_fr
13ac0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
13ad0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13ae0 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65  fo *allocateInde
13af0 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a  xInfo(.  Parse *
13b00 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65  pParse, .  Where
13b10 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73  Clause *pWC,.  s
13b20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
13b30 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  em *pSrc,.  Expr
13b40 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29  List *pOrderBy.)
13b50 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
13b60 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72  int nTerm;.  str
13b70 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13b80 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
13b90 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
13ba0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
13bb0 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65  rderby *pIdxOrde
13bc0 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71  rBy;.  struct sq
13bd0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13be0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
13bf0 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
13c00 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
13c10 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69  nOrderBy;.  sqli
13c20 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
13c30 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45  pIdxInfo;..  WHE
13c40 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70  RETRACE(("Recomp
13c50 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f  uting index info
13c60 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70   for %s...\n", p
13c70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
13c80 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  ));..  /* Count 
13c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
13ca0 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
13cb0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
13cc0 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
13cd0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
13ce0 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
13cf0 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
13d00 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
13d10 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
13d20 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
13d30 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
13d40 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
13d50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
13d60 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65  ssert( (pTerm->e
13d70 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d  Operator&(pTerm-
13d80 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d  >eOperator-1))==
13d90 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
13da0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
13db0 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
13dc0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13dd0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
13de0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
13df0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
13e00 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
13e10 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
13e20 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ue;.    if( pTer
13e30 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
13e40 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  M_VNULL ) contin
13e50 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ue;.    nTerm++;
13e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
13e70 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13e80 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
13e90 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
13ea0 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72  urrent .  ** vir
13eb0 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20  tual table then 
13ec0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
13ed0 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20  or the aOrderBy 
13ee0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  part of.  ** the
13ef0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13f00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20  nfo structure.. 
13f10 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   */.  nOrderBy =
13f20 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
13f30 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  By ){.    for(i=
13f40 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
13f50 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13f60 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
13f70 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
13f80 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
13f90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
13fa0 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
13fb0 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
13fc0 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
13fd0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
13fe0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
13ff0 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79  {.      nOrderBy
14000 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
14010 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pr;.    }.  }.. 
14020 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
14030 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14040 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
14050 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
14060 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
14070 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
14080 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f  sizeof(*pIdxInfo
14090 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28               + (
140b0 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73  sizeof(*pIdxCons
140c0 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61  ) + sizeof(*pUsa
140d0 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20  ge))*nTerm.     
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140f0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a        + sizeof(*
14100 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72  pIdxOrderBy)*nOr
14110 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70  derBy );.  if( p
14120 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
14130 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14140 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
14150 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
14160 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20  /* (double)0 In 
14170 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
14180 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
14190 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  NT... */.    ret
141a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
141b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
141c0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
141d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
141e0 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  fo structure con
141f0 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20  tains.  ** many 
14200 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20  fields that are 
14210 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22  declared "const"
14220 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73   to prevent xBes
14230 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a  tIndex from.  **
14240 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20   changing them. 
14250 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   We have to do s
14260 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e  ome funky castin
14270 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  g in order to.  
14280 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** initialize th
14290 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f  ose fields..  */
142a0 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73  .  pIdxCons = (s
142b0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
142c0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
142d0 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
142e0 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
142f0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14300 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
14310 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
14320 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
14330 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14340 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
14350 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
14360 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e  OrderBy];.  *(in
14370 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t*)&pIdxInfo->nC
14380 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72  onstraint = nTer
14390 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  m;.  *(int*)&pId
143a0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
143b0 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  = nOrderBy;.  *(
143c0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
143d0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
143e0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
143f0 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43  nstraint = pIdxC
14400 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  ons;.  *(struct 
14410 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
14420 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66  derby**)&pIdxInf
14430 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49  o->aOrderBy = pI
14440 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73  dxOrderBy;.  *(s
14450 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14460 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
14470 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
14480 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
14490 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
144e0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
144f0 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
14500 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
14510 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
14520 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
14530 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
14540 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
14550 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
14560 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
14570 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
14580 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  1))==0 );.    te
14590 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
145a0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
145b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
145c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
145d0 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  r==WO_ISNULL );.
145e0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
145f0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
14600 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63  N|WO_ISNULL) ) c
14610 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14620 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
14630 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
14640 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64  ontinue;.    pId
14650 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e  xCons[j].iColumn
14660 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
14670 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
14680 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  Cons[j].iTermOff
14690 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64  set = i;.    pId
146a0 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75  xCons[j].op = (u
146b0 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
146c0 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  or;.    /* The d
146d0 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74  irect assignment
146e0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
146f0 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c   line is possibl
14700 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20  e only because. 
14710 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
14720 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
14730 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
14740 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
14750 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
14760 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
14770 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
14780 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  */.    assert( W
14790 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_EQ==SQLITE_IND
147a0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
147b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
147c0 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
147d0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
147e0 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
147f0 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
14800 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14810 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
14820 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_GT==SQLITE_
14830 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14840 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GT );.    asser
14850 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
14860 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14870 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GE );.    asse
14880 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51  rt( WO_MATCH==SQ
14890 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
148a0 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20  RAINT_MATCH );. 
148b0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
148c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
148d0 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
148e0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
148f0 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b  MATCH) );.    j+
14900 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
14910 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
14920 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
14930 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
14940 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14950 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
14960 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
14970 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
14980 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
14990 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
149a0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
149b0 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
149c0 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nfo;.}../*.** Th
149d0 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e table object r
149e0 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20  eference passed 
149f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14a00 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
14a10 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
14a20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74  represent a virt
14a30 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ual table. This 
14a40 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73  function invokes
14a50 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
14a60 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  ).** method of t
14a70 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
14a80 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65   with the sqlite
14a90 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69  3_index_info poi
14aa0 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  nter passed.** a
14ab0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  s the argument..
14ac0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14ad0 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
14ae0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
14af0 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
14b00 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
14b10 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
14b20 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
14b30 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
14b40 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
14b50 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
14b60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14b70 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14b80 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
14b90 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
14ba0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
14bb0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
14bc0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
14bd0 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
14be0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14bf0 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
14c00 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
14c10 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
14c20 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
14c30 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
14c40 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
14c50 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
14c60 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
14c70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
14c80 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
14c90 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
14ca0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
14cb0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
14cc0 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
14cd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
14ce0 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  c;..  WHERETRACE
14cf0 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f  (("xBestIndex fo
14d00 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  r %s\n", pTab->z
14d10 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f  Name));.  TRACE_
14d20 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20  IDX_INPUTS(p);. 
14d30 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
14d40 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
14d50 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52  (pVtab, p);.  TR
14d60 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
14d70 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  p);..  if( rc!=S
14d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14da0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50  OMEM ){.      pP
14db0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14dc0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
14dd0 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62  }else if( !pVtab
14de0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
14df0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e00 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
14e10 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
14e20 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
14e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14e40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
14e50 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  s", pVtab->zErrM
14e60 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  sg);.    }.  }. 
14e70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
14e80 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
14e90 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
14ea0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
14eb0 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
14ec0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
14ed0 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74   !p->aConstraint
14ee0 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d  [i].usable && p-
14ef0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14f00 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
14f10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14f20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
14f40 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
14f50 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
14f60 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
14f70 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14f80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14f90 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
14fa0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
14fb0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
14fc0 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
14fd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65  le..**.** The be
14fe0 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70  st index is comp
14ff0 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73  uted by the xBes
15000 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66  tIndex method of
15010 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20   the virtual.** 
15020 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54  table module.  T
15030 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
15040 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61  eally just a wra
15050 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75  pper that sets u
15060 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  p.** the sqlite3
15070 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15080 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73  cture that is us
15090 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74  ed to communicat
150a0 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49  e with.** xBestI
150b0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ndex..**.** In a
150c0 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74   join, this rout
150d0 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c  ine might be cal
150e0 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  led multiple tim
150f0 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61  es for the.** sa
15100 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  me virtual table
15110 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
15120 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
15130 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ure is created.*
15140 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
15150 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
15160 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65  nvocation and re
15170 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73  used on all subs
15180 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61  equent.** invoca
15190 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69  tions.  The sqli
151a0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
151b0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
151c0 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f   used when.** co
151d0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
151e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69  to access the vi
151f0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
15200 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74  e whereInfoDelet
15210 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  e() .** routine 
15220 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72  takes care of fr
15230 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  eeing the sqlite
15240 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
15250 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20  ucture after.** 
15260 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69  everybody has fi
15270 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a  nished with it..
15280 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
15290 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
152a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
152b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152c0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
152d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
152e0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15300 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
15310 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
15320 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
15330 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c,      /* The F
15340 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
15350 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
15360 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
15390 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
153a0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  for index */.  B
153b0 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c  itmask notValid,
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
153d0 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 76 61  * Cursors not va
153e0 6c 69 64 20 66 6f 72 20 61 6e 79 20 70 75 72 70  lid for any purp
153f0 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ose */.  ExprLis
15400 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
15410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15420 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
15430 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
15440 70 43 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20  pCost,          
15450 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
15460 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
15470 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  /.  sqlite3_inde
15480 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
15490 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66  fo  /* Index inf
154a0 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20  ormation passed 
154b0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  to xBestIndex */
154c0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
154d0 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  b = pSrc->pTab;.
154e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
154f0 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
15500 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
15510 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
15520 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
15530 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15540 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
15550 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
15560 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15570 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
15580 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
15590 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20  double rCost;.. 
155a0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73   /* Make sure ws
155b0 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c  Flags is initial
155c0 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e  ized to some san
155d0 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69  e value. Otherwi
155e0 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a  se, if the .  **
155f0 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63   malloc in alloc
15600 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66  ateIndexInfo() f
15610 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75  ails and this fu
15620 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c  nction returns l
15630 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c  eaving.  ** wsFl
15640 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74  ags in an uninit
15650 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74  ialized state, t
15660 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65  he caller may be
15670 68 61 76 65 20 75 6e 70 72 65 64 69 63 74 61 62  have unpredictab
15680 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ly..  */.  memse
15690 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
156a0 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
156b0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
156c0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
156d0 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49  ALTABLE;..  /* I
156e0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
156f0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
15700 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
15710 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20  previously.  ** 
15720 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e  allocated and in
15730 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20  itialized, then 
15740 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  allocate and ini
15750 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a  tialize it now..
15760 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
15770 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20  = *ppIdxInfo;.  
15780 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15790 29 7b 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66  ){.    *ppIdxInf
157a0 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  o = pIdxInfo = a
157b0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
157c0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
157d0 72 63 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  rc, pOrderBy);. 
157e0 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66   }.  if( pIdxInf
157f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
15800 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  rn;.  }..  /* At
15810 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
15820 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15830 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
15840 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e  at pIdxInfo poin
15850 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20  ts.  ** to will 
15860 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61  have been initia
15870 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75  lized, either du
15880 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15890 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20   invocation or. 
158a0 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20   ** during some 
158b0 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e  prior invocation
158c0 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68  .  Now we just h
158d0 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65  ave to customize
158e0 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c   the.  ** detail
158f0 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f  s of pIdxInfo fo
15900 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  r the current in
15910 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73  vocation and pas
15920 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65  s it to.  ** xBe
15930 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20  stIndex..  */.. 
15940 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e   /* The module n
15950 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  ame must be defi
15960 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68  ned. Also, by th
15970 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
15980 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f  ust.  ** be a po
15990 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
159a0 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
159b0 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  re. Otherwise.  
159c0 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  ** sqlite3ViewGe
159d0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77  tColumnNames() w
159e0 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64  ould have picked
159f0 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a   up the error. .
15a00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15a10 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
15a20 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75   && pTab->azModu
15a30 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73  leArg[0] );.  as
15a40 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74  sert( sqlite3Get
15a50 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
15a60 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f  b, pTab) );..  /
15a70 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74  * Set the aConst
15a80 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66  raint[].usable f
15a90 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61  ields and initia
15aa0 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f  lize all .  ** o
15ab0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
15ac0 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
15ad0 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
15ae0 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
15af0 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
15b00 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
15b10 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63  hand.  ** side c
15b20 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
15b30 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
15b40 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
15b50 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
15b60 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  * table.  In oth
15b70 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
15b80 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
15b90 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
15ba0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
15bb0 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20  column = expr.  
15bc0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  **.  ** and we a
15bd0 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20  re evaluating a 
15be0 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  join, then the c
15bf0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
15c00 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c  umn is .  ** onl
15c10 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
15c20 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
15c30 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
15c40 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
15c50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
15c60 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
15c70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43    **.  ** The aC
15c80 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72  onstraints[] arr
15c90 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ay contains entr
15ca0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ies for all cons
15cb0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
15cc0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
15cd0 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20  e.  That way we 
15ce0 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d  only have to com
15cf0 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a  pute it once.  *
15d00 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * even though we
15d10 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69   might try to pi
15d20 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ck the best inde
15d30 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  x multiple times
15d40 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  ..  ** For each 
15d50 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69  attempt at picki
15d60 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  ng an index, the
15d70 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
15d80 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69   in the.  ** joi
15d90 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  n might be diffe
15da0 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20  rent so we have 
15db0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
15dc0 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a   usable flag.  *
15dd0 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a  * each time..  *
15de0 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
15df0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
15e00 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
15e10 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
15e20 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73  onstraint;.  pUs
15e30 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
15e40 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
15e50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15e60 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
15e70 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
15e80 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20  ons++){.    j = 
15e90 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
15ea0 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d  ffset;.    pTerm
15eb0 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
15ec0 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
15ed0 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72  ble = (pTerm->pr
15ee0 65 72 65 71 52 69 67 68 74 26 6e 6f 74 52 65 61  ereqRight&notRea
15ef0 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d  dy) ? 0 : 1;.  }
15f00 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
15f10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
15f20 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
15f30 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
15f40 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
15f50 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15f60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15f70 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
15f80 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
15f90 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
15fa0 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
15fb0 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
15fc0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
15fd0 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
15fe0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
15ff0 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
16000 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49  /* ((double)2) I
16010 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
16020 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
16030 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64  OINT... */.  pId
16040 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
16050 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
16060 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65  G_DBL / ((double
16070 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  )2);.  nOrderBy 
16080 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
16090 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70 4f 72  erBy;.  if( !pOr
160a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64  derBy ){.    pId
160b0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
160c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
160d0 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
160e0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
160f0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  Info) ){.    ret
16100 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78  urn;.  }..  pIdx
16110 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
16120 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
16130 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
16140 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
16150 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
16160 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
16170 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
16180 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61   if( pUsage[i].a
16190 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
161a0 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20      pCost->used 
161b0 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f  |= pWC->a[pIdxCo
161c0 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[i].iTermOffse
161d0 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  t].prereqRight;.
161e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
161f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
16200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
16210 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65 64  and the selected
16220 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
16230 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  ndex.  ** does n
16240 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c 20 69  ot satisfy it, i
16250 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f 73 74  ncrease the cost
16260 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63 63   of the scan acc
16270 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20  ordingly. This. 
16280 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20   ** matches the 
16290 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e  processing for n
162a0 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65  on-virtual table
162b0 73 20 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e  s in bestBtreeIn
162c0 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43  dex()..  */.  rC
162d0 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ost = pIdxInfo->
162e0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20  estimatedCost;. 
162f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
16300 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
16310 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b  ByConsumed==0 ){
16320 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73  .    rCost += es
16330 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73  tLog(rCost)*rCos
16340 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  t;.  }..  /* The
16350 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c   cost is not all
16360 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  owed to be large
16370 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49  r than SQLITE_BI
16380 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20  G_DBL (the.  ** 
16390 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
163a0 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
163b0 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
163c0 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  s, then the.  **
163d0 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73   (cost<lowestCos
163e0 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69  t) test below wi
163f0 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
16400 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65  ..  ** .  ** Use
16410 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73   "(double)2" ins
16420 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e  tead of "2.0" in
16430 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54   case OMIT_FLOAT
16440 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20  ING_POINT .  ** 
16450 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f  is defined..  */
16460 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42  .  if( (SQLITE_B
16470 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29  IG_DBL/((double)
16480 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20  2))<rCost ){.   
16490 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
164a0 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
164b0 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20  ((double)2));.  
164c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73 74  }else{.    pCost
164d0 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
164e0 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  .  }.  pCost->pl
164f0 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20  an.u.pVtabIdx = 
16500 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
16510 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
16520 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
16530 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
16540 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
16550 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f  DERBY;.  }.  pCo
16560 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30  st->plan.nEq = 0
16570 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  ;.  pIdxInfo->nO
16580 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
16590 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  y;..  /* Try to 
165a0 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69  find a more effi
165b0 63 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74  cient access pat
165c0 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75  tern by using mu
165d0 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20  ltiple indexes. 
165e0 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20   ** to optimize 
165f0 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e  an OR expression
16600 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
16610 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a  E clause. .  */.
16620 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e    bestOrClauseIn
16630 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
16640 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
16650 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65   notValid, pOrde
16660 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23  rBy, pCost);.}.#
16670 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16680 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16690 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
166a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
166b0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
166c0 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
166d0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
166e0 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
166f0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
16700 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
16710 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
16720 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
16730 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
16740 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
16750 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
16760 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
16770 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
16780 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
16790 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
167a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
167b0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
167c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
167d0 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
167e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
167f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16800 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16810 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16830 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
16840 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
16850 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
16860 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
16870 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
16880 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
16890 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
168a0 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
168b0 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
168c0 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
168d0 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
168e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
168f0 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16900 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
16910 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
16920 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
16930 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
16940 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
16950 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
16960 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
16970 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
16980 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
16990 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
169a0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
169b0 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
169c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
169d0 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
169e0 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
169f0 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
16a00 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 69 20 3d  ->aSample;.  i =
16a10 20 30 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71   0;.  eType = sq
16a20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
16a30 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 65  (pVal);..  if( e
16a40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
16a50 45 47 45 52 20 29 7b 0a 20 20 20 20 76 20 3d 20  EGER ){.    v = 
16a60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
16a70 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20 20 72  t64(pVal);.    r
16a80 20 3d 20 28 69 36 34 29 76 3b 0a 20 20 20 20 66   = (i64)v;.    f
16a90 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
16aa0 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
16ab0 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16ac0 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16ad0 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
16ae0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  e;.      if( aSa
16af0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
16b00 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
16b10 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ak;.      if( aS
16b20 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16b30 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
16b40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
16b50 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69 3e 3d 76 20  ample[i].u.i>=v 
16b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 45  ){.          isE
16b70 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  q = aSample[i].u
16b80 2e 69 3d 3d 76 3b 0a 20 20 20 20 20 20 20 20 20  .i==v;.         
16b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16ba0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
16bc0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
16bd0 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 3b  =SQLITE_FLOAT );
16be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
16bf0 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29  mple[i].u.r>=r )
16c00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 45 71  {.          isEq
16c10 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e   = aSample[i].u.
16c20 72 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 20 20  r==r;.          
16c30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16c50 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65   }else if( eType
16c60 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
16c70 7b 0a 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65  {.    r = sqlite
16c80 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
16c90 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Val);.    for(i=
16ca0 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
16cb0 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
16cc0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16cd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type==SQLITE_NUL
16ce0 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
16cf0 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16d00 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45  i].eType>=SQLITE
16d10 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20  _TEXT ) break;. 
16d20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16d30 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16d40 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
16d50 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
16d60 69 5d 2e 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65  i].u.r;.      }e
16d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 53 20  lse{.        rS 
16d80 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  = aSample[i].u.i
16d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16da0 69 66 28 20 72 53 3e 3d 72 20 29 7b 0a 20 20 20  if( rS>=r ){.   
16db0 20 20 20 20 20 69 73 45 71 20 3d 20 72 53 3d 3d       isEq = rS==
16dc0 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
16dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16de0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70    }else if( eTyp
16df0 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
16e00 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20  {.    i = 0;.   
16e10 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 30 5d 2e   if( aSample[0].
16e20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16e30 4c 4c 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20  LL ) isEq = 1;. 
16e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
16e50 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
16e60 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d  E_TEXT || eType=
16e70 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a  =SQLITE_BLOB );.
16e80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16e90 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  Idx->nSample; i+
16ea0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
16eb0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
16ec0 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 61  SQLITE_TEXT || a
16ed0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
16ee0 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
16ef0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16f10 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61   if( i<pIdx->nSa
16f20 6d 70 6c 65 20 29 7b 20 20 20 20 20 20 0a 20 20  mple ){      .  
16f30 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
16f40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16f50 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
16f60 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ll;.      const 
16f70 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69 66 28  u8 *z;.      if(
16f80 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
16f90 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  LOB ){.        z
16fa0 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
16fb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
16fc0 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  b(pVal);.       
16fd0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
16fe0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
16ff0 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65  assert( pColl->e
17000 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
17010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17020 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17030 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
17040 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
17050 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43  8, 0, *pIdx->azC
17060 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
17070 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
17080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17090 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
170a0 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
170b0 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22  on sequence: %s"
170c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
170d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 49 64              *pId
170e0 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
170f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17100 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
17110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d     }.        z =
17120 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
17130 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
17140 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
17150 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20  .        if( !z 
17160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
17170 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
17180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17190 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
171a0 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
171b0 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d  >xCmp );.      }
171c0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
171d0 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61  e3ValueBytes(pVa
171e0 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
171f0 20 20 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69    .      for(; i
17200 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
17210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
17220 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
17230 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61   eSampletype = a
17240 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b  Sample[i].eType;
17250 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
17260 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29  mpletype<eType )
17270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17280 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79     if( eSamplety
17290 70 65 21 3d 65 54 79 70 65 20 29 20 62 72 65 61  pe!=eType ) brea
172a0 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  k;.#ifndef SQLIT
172b0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
172c0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e       if( pColl->
172d0 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
172e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
172f0 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20  t nSample;.     
17300 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70       char *zSamp
17310 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38  le = sqlite3Utf8
17320 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20  to16(.          
17330 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65      db, pColl->e
17340 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  nc, aSample[i].u
17350 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  .z, aSample[i].n
17360 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20  Byte, &nSample. 
17370 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
17380 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70        if( !zSamp
17390 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
173a0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
173b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
173c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
173d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
173e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
173f0 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e       c = pColl->
17400 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
17410 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d  r, nSample, zSam
17420 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  ple, n, z);.    
17430 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17440 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29  ree(db, zSample)
17450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
17460 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
17470 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
17480 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
17490 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65  ->pUser, aSample
174a0 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70  [i].nByte, aSamp
174b0 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29  le[i].u.z, n, z)
174c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
174d0 20 20 20 20 69 66 28 20 63 3e 3d 30 20 29 7b 0a      if( c>=0 ){.
174e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
174f0 3d 30 20 29 20 69 73 45 71 20 3d 20 31 3b 0a 20  =0 ) isEq = 1;. 
17500 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17520 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
17530 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
17540 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
17550 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
17560 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20  that is greater 
17570 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75  than.  ** or equ
17580 61 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20  al to pVal.  Or 
17590 69 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d  if i==pIdx->nSam
175a0 70 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61  ple, then all sa
175b0 6d 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20  mples are less. 
175c0 20 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20   ** than pVal.  
175d0 49 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70  If aSample[i]==p
175e0 56 61 6c 2c 20 74 68 65 6e 20 69 73 45 71 3d 3d  Val, then isEq==
175f0 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  1..  */.  if( is
17600 45 71 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Eq ){.    assert
17610 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
17620 65 20 29 3b 0a 20 20 20 20 61 53 74 61 74 5b 30  e );.    aStat[0
17630 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  ] = aSample[i].n
17640 4c 74 3b 0a 20 20 20 20 61 53 74 61 74 5b 31 5d  Lt;.    aStat[1]
17650 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45   = aSample[i].nE
17660 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  q;.  }else{.    
17670 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20  tRowcnt iLower, 
17680 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20  iUpper, iGap;.  
17690 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
176a0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
176b0 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
176c0 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c 74 3b 0a 20  Sample[0].nLt;. 
176d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
176e0 69 55 70 70 65 72 20 3d 20 69 3e 3d 70 49 64 78  iUpper = i>=pIdx
176f0 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20 6e 20 3a 20  ->nSample ? n : 
17700 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a  aSample[i].nLt;.
17710 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
17720 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 45 71 20  Sample[i-1].nEq 
17730 2b 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e  + aSample[i-1].n
17740 4c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  Lt;.    }.    aS
17750 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
17760 76 67 45 71 3b 0a 20 20 20 20 69 66 28 20 69 4c  vgEq;.    if( iL
17770 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
17780 20 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a        iGap = 0;.
17790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
177a0 20 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d   iGap = iUpper -
177b0 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20   iLower;.    }. 
177c0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
177d0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28  {.      iGap = (
177e0 69 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d  iGap*2)/3;.    }
177f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
17800 20 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d   = iGap/3;.    }
17810 0a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20  .    aStat[0] = 
17820 69 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20  iLower + iGap;. 
17830 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17840 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
17850 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
17860 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT3 */../*.**
17870 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
17880 45 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20  Expr represents 
17890 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c  a literal value,
178a0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
178b0 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74  t to.** an sqlit
178c0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
178d0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
178e0 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69  e same value, wi
178f0 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61  th affinity.** a
17900 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
17910 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  , before returni
17920 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ng. It is the re
17930 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
17940 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
17950 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
17960 65 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74  ease this struct
17970 75 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69  ure by passing i
17980 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  t to .** sqlite3
17990 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a  ValueFree()..**.
179a0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
179b0 74 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63  t parse is a rec
179c0 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52  ompile (sqlite3R
179d0 65 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20  eprepare()) and 
179e0 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53  pExpr.** is an S
179f0 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  QL variable that
17a00 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
17a10 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
17a20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20  bound to it,.** 
17a30 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
17a40 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
17a50 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  e containing thi
17a60 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77  s value, again w
17a70 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  ith.** affinity 
17a80 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69  aff applied to i
17a90 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  t, instead..**.*
17aa0 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20  * If neither of 
17ab0 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c  the above apply,
17ac0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
17ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
17ae0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
17af0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17b00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
17b10 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65  ITE_OK..*/.#ifde
17b20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17b30 53 54 41 54 33 0a 73 74 61 74 69 63 20 69 6e 74  STAT3.static int
17b40 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
17b50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17b60 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
17b70 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73   .  u8 aff, .  s
17b80 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
17b90 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  p.){.  if( pExpr
17ba0 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
17bb0 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e  E.   || (pExpr->
17bc0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
17bd0 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54  && pExpr->op2==T
17be0 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b  K_VARIABLE).  ){
17bf0 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20  .    int iVar = 
17c00 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
17c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
17c20 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
17c30 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 20  ->pVdbe, iVar); 
17c40 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d  /* IMP: R-23257-
17c50 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a 70 70  02778 */.    *pp
17c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
17c70 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  tValue(pParse->p
17c80 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
17c90 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72   aff);.    retur
17ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17cb0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
17cc0 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
17cd0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
17ce0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61  , SQLITE_UTF8, a
17cf0 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69  ff, pp);.}.#endi
17d00 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
17d10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
17d20 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
17d30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
17d40 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74  at will be visit
17d50 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e  ed.** by scannin
17d60 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61  g an index for a
17d70 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73   range of values
17d80 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20  . The range may 
17d90 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a  have an upper.**
17da0 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20   bound, a lower 
17db0 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20  bound, or both. 
17dc0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
17dd0 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20   terms that set 
17de0 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64  the upper.** and
17df0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72   lower bounds ar
17e00 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  e represented by
17e10 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
17e20 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  er respectively.
17e30 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
17e40 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
17e50 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
17e60 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  a):.**.**   ... 
17e70 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17e80 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
17e90 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
17ea0 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20          |_____| 
17eb0 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20    |_____|.**    
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a     |         |.*
17ee0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17ef0 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20        pLower    
17f00 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  pUpper.**.** If 
17f10 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70  either of the up
17f20 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
17f30 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nd is not presen
17f40 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  t, then NULL is 
17f50 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61  passed in.** pla
17f60 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ce of the corres
17f70 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72  ponding WhereTer
17f80 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71  m..**.** The nEq
17f90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
17fa0 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f  ssed the index o
17fb0 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
17fc0 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
17fd0 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74  e.** range const
17fe0 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
17ff0 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
18000 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
18010 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f  constraints.** o
18020 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
18030 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
18040 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
18050 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  , assuming index
18060 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61   p is.** on t1(a
18070 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
18080 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
18090 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
180a0 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
180b0 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
180c0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
180d0 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  Eq should be pas
180e0 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20  sed the value 1 
180f0 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
18100 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
18110 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65  .** b, is the se
18120 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63  cond left-most c
18130 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
18140 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
18150 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
18160 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
18170 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
18180 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
18190 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
181a0 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a   passed 0..**.**
181b0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
181c0 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lue is an intege
181d0 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64  r divisor to red
181e0 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  uce the estimate
181f0 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63  d.** search spac
18200 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c  e.  A return val
18210 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68  ue of 1 means th
18220 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  at range constra
18230 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68  ints are.** no h
18240 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72  elp at all.  A r
18250 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32  eturn value of 2
18260 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e   means range con
18270 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
18280 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64 75  expected to redu
18290 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
182a0 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e  ace by half.  An
182b0 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a  d so forth....**
182c0 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
182d0 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
182e0 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t3 ANALYZE data,
182f0 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71   each range ineq
18300 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65  uality.** reduce
18310 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
18320 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
18330 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69  f 4.  Hence a si
18340 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
18350 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73  (x>?).** results
18360 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
18370 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f  4 and a range co
18380 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e  nstraint (x>? AN
18390 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a  D x<?) results.*
183a0 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  * in a return of
183b0 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   16..*/.static i
183c0 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
183d0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
183e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
183f0 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
18400 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
18410 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
18420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18430 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
18440 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f  ing the range-co
18450 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22  mpared column; "
18460 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  x" */.  int nEq,
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18480 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43  index into p->aC
18490 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67  ol[] of the rang
184a0 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
184b0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
184c0 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
184d0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
184e0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
184f0 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
18500 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
18510 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
18520 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
18530 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
18540 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
18550 55 4c 4c 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ULL */.  double 
18560 2a 70 52 61 6e 67 65 44 69 76 20 20 20 2f 2a 20  *pRangeDiv   /* 
18570 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61 72  OUT: Reduce sear
18580 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69 73  ch space by this
18590 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20   divisor */.){. 
185a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
185b0 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  _OK;..#ifdef SQL
185c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
185d0 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26  ..  if( nEq==0 &
185e0 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  & p->nSample ){.
185f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
18600 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20  e *pRangeVal;.  
18610 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
18620 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e   = 0;.    tRowcn
18630 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 61 69  t iUpper = p->ai
18640 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74  RowEst[0];.    t
18650 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20  Rowcnt a[2];.   
18660 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
18670 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
18680 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
18690 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f  ty;..    if( pLo
186a0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70  wer ){.      Exp
186b0 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
186c0 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
186d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c  ;.      rc = val
186e0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
186f0 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
18700 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20  pRangeVal);.    
18710 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72    assert( pLower
18720 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
18730 47 54 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f  GT || pLower->eO
18740 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29  perator==WO_GE )
18750 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18760 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
18770 20 26 26 20 77 68 65 72 65 4b 65 79 53 74 61 74   && whereKeyStat
18780 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 61  s(pParse, p, pRa
18790 6e 67 65 56 61 6c 2c 20 30 2c 20 61 29 3d 3d 53  ngeVal, 0, a)==S
187a0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
187b0 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
187c0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
187d0 20 69 66 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70   if( pLower->eOp
187e0 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 29 20  erator==WO_GT ) 
187f0 69 4c 6f 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a  iLower += a[1];.
18800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18810 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
18820 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d  RangeVal);.    }
18830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18840 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70 65 72  ITE_OK && pUpper
18850 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
18860 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e  pExpr = pUpper->
18870 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
18880 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
18890 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
188a0 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61  pExpr, aff, &pRa
188b0 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61  ngeVal);.      a
188c0 73 73 65 72 74 28 20 70 55 70 70 65 72 2d 3e 65  ssert( pUpper->e
188d0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
188e0 7c 7c 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  || pUpper->eOper
188f0 61 74 6f 72 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  ator==WO_LE );. 
18900 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18910 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26  ITE_OK.       &&
18920 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18930 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65  Parse, p, pRange
18940 56 61 6c 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49  Val, 1, a)==SQLI
18950 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20  TE_OK.      ){. 
18960 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20         iUpper = 
18970 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[0];.        if
18980 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ( pUpper->eOpera
18990 74 6f 72 3d 3d 57 4f 5f 4c 45 20 29 20 69 55 70  tor==WO_LE ) iUp
189a0 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  per += a[1];.   
189b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
189c0 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
189d0 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
189e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
189f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
18a00 20 69 55 70 70 65 72 3c 3d 69 4c 6f 77 65 72 20   iUpper<=iLower 
18a10 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 61 6e  ){.        *pRan
18a20 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29  geDiv = (double)
18a30 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
18a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18a50 20 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20       *pRangeDiv 
18a60 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52  = (double)p->aiR
18a70 6f 77 45 73 74 5b 30 5d 2f 28 64 6f 75 62 6c 65  owEst[0]/(double
18a80 29 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  )(iUpper - iLowe
18a90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18aa0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 72    WHERETRACE(("r
18ab0 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f 6e  ange scan region
18ac0 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d 25  s: %u..%u  div=%
18ad0 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
18ae0 20 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f          (u32)iLo
18af0 77 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72  wer, (u32)iUpper
18b00 2c 20 2a 70 52 61 6e 67 65 44 69 76 29 29 3b 0a  , *pRangeDiv));.
18b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18b20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18b30 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
18b40 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
18b50 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
18b60 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
18b70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45  SED_PARAMETER(nE
18b80 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  q);.#endif.  ass
18b90 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
18ba0 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e  Upper );.  *pRan
18bb0 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29  geDiv = (double)
18bc0 31 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  1;.  if( pLower 
18bd0 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c  && (pLower->wtFl
18be0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
18bf0 29 3d 3d 30 20 29 20 2a 70 52 61 6e 67 65 44 69  )==0 ) *pRangeDi
18c00 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a  v *= (double)4;.
18c10 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20 2a    if( pUpper ) *
18c20 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f  pRangeDiv *= (do
18c30 75 62 6c 65 29 34 3b 0a 20 20 72 65 74 75 72 6e  uble)4;.  return
18c40 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
18c50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
18c60 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
18c70 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18c80 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
18c90 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
18ca0 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
18cb0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
18cc0 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
18cd0 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
18ce0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
18cf0 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
18d00 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
18d10 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
18d20 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
18d30 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
18d40 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
18d50 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
18d60 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
18d70 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e  hat index.  When
18d80 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61   pExpr==NULL tha
18d90 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73  t means the cons
18da0 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20  traint is.** "x 
18db0 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64  IS NULL" instead
18dc0 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a   of "x=VALUE"..*
18dd0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
18de0 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
18df0 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
18e00 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18e10 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
18e20 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
18e30 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
18e40 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
18e50 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
18e60 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
18e70 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
18e80 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
18e90 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
18ea0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
18eb0 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
18ec0 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
18ed0 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
18ee0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
18ef0 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
18f00 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
18f10 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
18f20 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
18f30 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
18f40 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
18f50 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
18f60 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  nt whereEqualSca
18f70 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
18f80 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
18f90 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
18fa0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
18fb0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18fd0 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c  he index whose l
18fe0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
18ff0 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78  is pTerm */.  Ex
19000 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
19010 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
19020 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
19030 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
19040 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  aint */.  double
19050 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f   *pnRow        /
19060 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
19070 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
19080 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
19090 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68  lite3_value *pRh
190a0 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45  s = 0;  /* VALUE
190b0 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
190c0 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a  ide of pTerm */.
190d0 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
190e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
190f0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
19100 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19120 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
19130 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
19140 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
19150 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
19160 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
19170 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
19180 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19190 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
191a0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
191b0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
191c0 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
191d0 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
191e0 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
191f0 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
19200 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73  Expr, aff, &pRhs
19210 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
19220 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53  goto whereEqualS
19230 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20  canEst_cancel;. 
19240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73   }else{.    pRhs
19250 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
19260 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ew(pParse->db);.
19270 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d    }.  if( pRhs==
19280 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19290 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63  E_NOTFOUND;.  rc
192a0 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
192b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73  (pParse, p, pRhs
192c0 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72  , 0, a);.  if( r
192d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
192e0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
192f0 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
19300 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
19310 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 20 20  int)a[1]));.    
19320 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20  *pnRow = a[1];. 
19330 20 7d 0a 77 68 65 72 65 45 71 75 61 6c 53 63 61   }.whereEqualSca
19340 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73  nEst_cancel:.  s
19350 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19360 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pRhs);.  return 
19370 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
19380 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19390 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a  NABLE_STAT3) */.
193a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
193b0 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
193c0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
193d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
193e0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
193f0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
19400 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  an IN constraint
19410 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
19420 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
19430 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
19440 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61   is a list of va
19450 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  lues.  Example:.
19460 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48 45  **.**        WHE
19470 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
19480 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ).**.** Write th
19490 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20  e estimated row 
194a0 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f  count into *pnRo
194b0 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  w and return SQL
194c0 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75  ITE_OK. .** If u
194d0 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e  nable to make an
194e0 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65   estimate, leave
194f0 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65   *pnRow unchange
19500 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  d and return.** 
19510 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
19520 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
19530 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20 75   fail if it is u
19540 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20  nable to load a 
19550 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19560 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66  ce.** required f
19570 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72  or string compar
19580 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62  ison, or if unab
19590 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
195a0 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55  emory.** for a U
195b0 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65  TF conversion re
195c0 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61  quired for compa
195d0 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f  rison.  The erro
195e0 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69  r is stored.** i
195f0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
19600 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
19610 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63 61  c int whereInSca
19620 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
19630 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
19640 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
19650 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
19660 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
19670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19680 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c  he index whose l
19690 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
196a0 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78  is pTerm */.  Ex
196b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
196c0 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
196d0 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
196e0 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
196f0 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f  v3,...)" */.  do
19700 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20  uble *pnRow     
19710 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
19720 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
19730 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
19740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19750 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  E_OK;         /*
19760 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
19770 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f  urn code */.  do
19780 75 62 6c 65 20 6e 45 73 74 3b 20 20 20 20 20 20  uble nEst;      
19790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
197a0 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20  ber of rows for 
197b0 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f  a single term */
197c0 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73  .  double nRowEs
197d0 74 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 20 2f  t = (double)0; /
197e0 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
197f0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
19800 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rows */.  int i;
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19830 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
19840 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
19850 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
19860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19870 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
19880 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20   i++){.    nEst 
19890 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  = p->aiRowEst[0]
198a0 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
198b0 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
198c0 72 73 65 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61  rse, p, pList->a
198d0 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74  [i].pExpr, &nEst
198e0 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b  );.    nRowEst +
198f0 3d 20 6e 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  = nEst;.  }.  if
19900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19910 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  ){.    if( nRowE
19920 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74  st > p->aiRowEst
19930 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  [0] ) nRowEst = 
19940 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  p->aiRowEst[0];.
19950 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f      *pnRow = nRo
19960 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54  wEst;.    WHERET
19970 52 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65 73  RACE(("IN row es
19980 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e  timate: est=%g\n
19990 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
199a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
199b0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
199c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
199d0 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 0a 2f 2a 0a  _STAT3) */.../*.
199e0 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
199f0 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
19a00 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72 74  accessing a part
19a10 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 57  icular table.  W
19a20 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
19a30 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
19a40 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
19a50 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
19a60 63 74 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  ct supplied as t
19a70 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d  he.** last param
19a80 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
19a90 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61 6e  lowest cost plan
19aa0 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
19ab0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
19ac0 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
19ad0 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
19ae0 20 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20 70   I/O needed to p
19af0 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
19b00 73 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20  sted result..** 
19b10 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
19b20 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
19b30 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
19b40 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
19b50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
19b60 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
19b70 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
19b80 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
19b90 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
19ba0 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
19bb0 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
19bc0 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
19bd0 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
19be0 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
19bf0 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
19c00 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
19c10 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
19c20 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
19c30 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73  .** If there was
19c40 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
19c50 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e  lause (pSrc->pIn
19c60 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74 6f  dex) attached to
19c70 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a   the table in.**
19c80 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
19c90 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
19ca0 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73  nction only cons
19cb0 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e  iders plans usin
19cc0 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20  g the .** named 
19cd0 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63  index. If no suc
19ce0 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c  h plan is found,
19cf0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
19d00 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51  ed cost is.** SQ
19d10 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66  LITE_BIG_DBL. If
19d20 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64   a plan is found
19d30 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e   that uses the n
19d40 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20  amed index, .** 
19d50 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73  then the cost is
19d60 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74   calculated in t
19d70 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a  he usual way..**
19d80 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44  .** If a NOT IND
19d90 45 58 45 44 20 63 6c 61 75 73 65 20 28 70 53 72  EXED clause (pSr
19da0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30  c->notIndexed!=0
19db0 29 20 77 61 73 20 61 74 74 61 63 68 65 64 20 74  ) was attached t
19dc0 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20  o the table .** 
19dd0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
19de0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f  atement, then no
19df0 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e   indexes are con
19e00 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72  sidered. However
19e10 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74  , the .** select
19e20 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c  ed plan may stil
19e30 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  l take advantage
19e40 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
19e50 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
19e60 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a  ey.** index..*/.
19e70 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
19e80 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 50 61  BtreeIndex(.  Pa
19e90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19eb0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
19ec0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
19ed0 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
19ee0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
19ef0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
19f00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19f10 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
19f20 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
19f30 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
19f40 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
19f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
19f60 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74  k of cursors not
19f70 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69   available for i
19f80 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
19f90 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20  mask notValid,  
19fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
19fb0 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
19fc0 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  e for any purpos
19fd0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
19fe0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
19ff0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1a000 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1a010 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
1a020 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ct,        /* Th
1a030 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 66  e select-list if
1a040 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e   query is DISTIN
1a050 43 54 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  CT */.  WhereCos
1a060 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20  t *pCost        
1a070 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f      /* Lowest co
1a080 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  st query plan */
1a090 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 20 3d  .){.  int iCur =
1a0a0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
1a0b0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1a0c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1a0d0 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
1a0e0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a100 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
1a110 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
1a120 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1a130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a140 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f  opy of pProbe, o
1a150 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20 69  r zero for IPK i
1a160 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71  ndex */.  int eq
1a170 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
1a180 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1a190 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
1a1a0 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
1a1b0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45 71  s */.  int idxEq
1a1c0 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20  TermMask;       
1a1d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b     /* Index mask
1a1e0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1a1f0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1a200 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a220 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
1a230 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
1a240 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52  mary key */.  tR
1a250 6f 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b  owcnt aiRowEstPk
1a260 5b 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  [2];      /* The
1a270 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75   aiRowEst[] valu
1a280 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
1a290 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43  dex */.  int aiC
1a2a0 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20  olumnPk = -1;   
1a2b0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c       /* The aCol
1a2c0 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20  umn[] value for 
1a2d0 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f  the sPk index */
1a2e0 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d 61 73  .  int wsFlagMas
1a2f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1a300 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20  * Allowed flags 
1a310 69 6e 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  in pCost->plan.w
1a320 73 46 6c 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49  sFlag */..  /* I
1a330 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
1a340 73 74 20 74 6f 20 61 20 77 6f 72 73 74 2d 63 61  st to a worst-ca
1a350 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65  se value */.  me
1a360 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
1a370 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
1a380 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
1a390 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
1a3a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53  ..  /* If the pS
1a3b0 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  rc table is the 
1a3c0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1a3d0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20   LEFT JOIN then 
1a3e0 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20  we may not.  ** 
1a3f0 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  use an index to 
1a400 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20  satisfy IS NULL 
1a410 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
1a420 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
1a430 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65   is.  ** because
1a440 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65   columns might e
1a450 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c  nd up being NULL
1a460 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
1a470 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20  es not match -. 
1a480 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e   ** a circumstan
1a490 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  ce which the ind
1a4a0 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75  ex cannot help u
1a4b0 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63  s discover.  Tic
1a4c0 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a  ket #2177..  */.
1a4d0 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e    if( pSrc->join
1a4e0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
1a4f0 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
1a500 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
1a510 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  N;.  }else{.    
1a520 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20  idxEqTermMask = 
1a530 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49  WO_EQ|WO_IN|WO_I
1a540 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66  SNULL;.  }..  if
1a550 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
1a560 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45  {.    /* An INDE
1a570 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73 70  XED BY clause sp
1a580 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69 63  ecifies a partic
1a590 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75 73  ular index to us
1a5a0 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20  e */.    pIdx = 
1a5b0 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
1a5c0 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46 6c 61  Index;.    wsFla
1a5d0 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f  gMask = ~(WHERE_
1a5e0 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
1a5f0 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
1a600 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64   eqTermMask = id
1a610 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d  xEqTermMask;.  }
1a620 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1a630 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
1a640 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
1a650 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
1a660 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
1a670 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
1a680 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
1a690 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
1a6a0 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
1a6b0 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
1a6c0 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
1a6d0 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
1a6e0 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
1a6f0 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
1a700 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
1a710 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
1a720 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
1a730 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1a740 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1a750 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
1a760 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
1a770 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
1a780 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
1a790 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c  ));.    sPk.nCol
1a7a0 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  umn = 1;.    sPk
1a7b0 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43  .aiColumn = &aiC
1a7c0 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b  olumnPk;.    sPk
1a7d0 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f  .aiRowEst = aiRo
1a7e0 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
1a7f0 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
1a800 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
1a810 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
1a820 62 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  b;.    aiRowEstP
1a830 6b 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61  k[0] = pSrc->pTa
1a840 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20  b->nRowEst;.    
1a850 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20  aiRowEstPk[1] = 
1a860 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  1;.    pFirst = 
1a870 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
1a880 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
1a890 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
1a8a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1a8b0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20  real indices of 
1a8c0 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e  the table are on
1a8d0 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66  ly considered if
1a8e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f   the.      ** NO
1a8f0 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66  T INDEXED qualif
1a900 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ier is omitted f
1a910 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  rom the FROM cla
1a920 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b  use */.      sPk
1a930 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  .pNext = pFirst;
1a940 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62  .    }.    pProb
1a950 65 20 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77 73  e = &sPk;.    ws
1a960 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20  FlagMask = ~(.  
1a970 20 20 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55        WHERE_COLU
1a980 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
1a990 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_EQ|WHERE_COLU
1a9a0 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f  MN_NULL|WHERE_CO
1a9b0 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29  LUMN_RANGE.    )
1a9c0 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
1a9d0 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
1a9e0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
1a9f0 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  }..  /* Loop ove
1aa00 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f  r all indices lo
1aa10 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oking for the be
1aa20 73 74 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20  st one to use.  
1aa30 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
1aa40 65 3b 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70  e; pIdx=pProbe=p
1aa50 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
1aa60 20 20 20 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74     const tRowcnt
1aa70 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73   * const aiRowEs
1aa80 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
1aa90 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65  wEst;.    double
1aaa0 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
1aab0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
1aac0 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
1aad0 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  .    double nRow
1aae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aaf0 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
1ab00 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ab10 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
1ab20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 20    double log10N 
1ab30 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a  = (double)1;  /*
1ab40 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72 69 74   base-10 logarit
1ab50 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78  hm of nRow (inex
1ab60 61 63 74 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  act) */.    int 
1ab70 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ab90 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
1aba0 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
1abb0 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 30 3b  int wsFlags = 0;
1abc0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65  .    Bitmask use
1abd0 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54  d = 0;..    /* T
1abe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1abf0 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
1ac00 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
1ac10 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 0a  e properties of.
1ac20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 65 69      ** index bei
1ac30 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68  ng evaluated. Th
1ac40 65 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64  ey are then used
1ac50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1ac60 65 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a  e expected.    *
1ac70 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65  * cost and numbe
1ac80 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1ac90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1aca0 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20  *  nEq: .    ** 
1acb0 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75     Number of equ
1acc0 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61 74  ality terms that
1acd0 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e   can be implemen
1ace0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ted using the in
1acf0 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49  dex..    **    I
1ad00 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1ad10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69  he number of ini
1ad20 74 69 61 6c 20 66 69 65 6c 64 73 20 69 6e 20 74  tial fields in t
1ad30 68 65 20 69 6e 64 65 78 20 74 68 61 74 0a 20 20  he index that.  
1ad40 20 20 2a 2a 20 20 20 20 61 72 65 20 75 73 65 64    **    are used
1ad50 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20   in == or IN or 
1ad60 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1ad70 69 6e 74 73 20 6f 66 20 74 68 65 20 57 48 45 52  ints of the WHER
1ad80 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  E clause..    **
1ad90 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a  .    **  nInMul:
1ada0 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65    .    **    The
1adb0 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22   "in-multiplier"
1adc0 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 73 74  . This is an est
1add0 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e  imate of how man
1ade0 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  y seek operation
1adf0 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c  s .    **    SQL
1ae00 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d  ite must perform
1ae10 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e   on the index in
1ae20 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65   question. For e
1ae30 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1ae40 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45 20      **    WHERE 
1ae50 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20 2a  clause is:.    *
1ae60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  *.    **      WH
1ae70 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c 20  ERE a IN (1, 2, 
1ae80 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c 20  3) AND b IN (4, 
1ae90 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20  5, 6).    **.   
1aea0 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
1aeb0 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f  st perform 9 loo
1aec0 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  kups on an index
1aed0 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e   on (a, b), so n
1aee0 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a  InMul is .    **
1aef0 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47 69      set to 9. Gi
1af00 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68  ven the same sch
1af10 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20 6f  ema and either o
1af20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1af30 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20 20  WHERE .    **   
1af40 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a   clauses:.    **
1af50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45  .    **      WHE
1af60 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a  RE a =  1.    **
1af70 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3e 3d        WHERE a >=
1af80 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   2.    **.    **
1af90 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65      nInMul is se
1afa0 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20  t to 1..    **. 
1afb0 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65 72     **    If ther
1afc0 65 20 65 78 69 73 74 73 20 61 20 57 48 45 52 45  e exists a WHERE
1afd0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
1afe0 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  m "x IN (SELECT 
1aff0 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20 20  ...)", then .   
1b000 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d 73   **    the sub-s
1b010 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65 64  elect is assumed
1b020 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72 6f   to return 25 ro
1b030 77 73 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  ws for the purpo
1b040 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20  ses of .    **  
1b050 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49    determining nI
1b060 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nMul..    **.   
1b070 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a 20   **  bInEst:  . 
1b080 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f 20     **    Set to 
1b090 74 72 75 65 20 69 66 20 74 68 65 72 65 20 77 61  true if there wa
1b0a0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 22  s at least one "
1b0b0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1b0c0 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20 20  )" term used .  
1b0d0 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65 72    **    in deter
1b0e0 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  mining the value
1b0f0 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74   of nInMul.  Not
1b100 65 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  e that the RHS o
1b110 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20 20  f the.    **    
1b120 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
1b130 20 62 65 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f   be a SELECT, no
1b140 74 20 61 20 76 61 6c 75 65 20 6c 69 73 74 2c 20  t a value list, 
1b150 66 6f 72 20 74 68 69 73 20 76 61 72 69 61 62 6c  for this variabl
1b160 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f 20 62  e.    **    to b
1b170 65 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20  e true..    **. 
1b180 20 20 20 2a 2a 20 20 72 61 6e 67 65 44 69 76 3a     **  rangeDiv:
1b190 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20 65 73  .    **    An es
1b1a0 74 69 6d 61 74 65 20 6f 66 20 61 20 64 69 76 69  timate of a divi
1b1b0 73 6f 72 20 62 79 20 77 68 69 63 68 20 74 6f 20  sor by which to 
1b1c0 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
1b1d0 68 20 73 70 61 63 65 20 64 75 65 0a 20 20 20 20  h space due.    
1b1e0 2a 2a 20 20 20 20 74 6f 20 69 6e 65 71 75 61 6c  **    to inequal
1b1f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1b200 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65    In the absence
1b210 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
1b220 20 41 4e 41 4c 59 5a 45 0a 20 20 20 20 2a 2a 20   ANALYZE.    ** 
1b230 20 20 20 64 61 74 61 2c 20 61 20 73 69 6e 67 6c     data, a singl
1b240 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
1b250 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
1b260 73 70 61 63 65 20 74 6f 20 31 2f 34 72 64 20 69  space to 1/4rd i
1b270 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6f 72 69  ts.    **    ori
1b280 67 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67  ginal size (rang
1b290 65 44 69 76 3d 3d 34 29 2e 20 20 54 77 6f 20 69  eDiv==4).  Two i
1b2a0 6e 65 71 75 61 6c 69 74 69 65 73 20 72 65 64 75  nequalities redu
1b2b0 63 65 20 74 68 65 20 73 65 61 72 63 68 0a 20 20  ce the search.  
1b2c0 20 20 2a 2a 20 20 20 20 73 70 61 63 65 20 74 6f    **    space to
1b2d0 20 31 2f 31 36 74 68 20 6f 66 20 69 74 73 20 6f   1/16th of its o
1b2e0 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 28 72 61  riginal size (ra
1b2f0 6e 67 65 44 69 76 3d 3d 31 36 29 2e 0a 20 20 20  ngeDiv==16)..   
1b300 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72   **.    **  bSor
1b310 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20  t:   .    **    
1b320 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
1b330 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1b340 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68 61  ER BY clause tha
1b350 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
1b360 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74  n .    **    ext
1b370 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e  ernal sort (i.e.
1b380 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e   scanning the in
1b390 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61  dex being evalua
1b3a0 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20  ted will not .  
1b3b0 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74 6c    **    correctl
1b3c0 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73 29  y order records)
1b3d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b3e0 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a   bLookup: .    *
1b3f0 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
1b400 75 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f  ue if a table lo
1b410 6f 6b 75 70 20 69 73 20 72 65 71 75 69 72 65 64  okup is required
1b420 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
1b430 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20  entry.    **    
1b440 76 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68  visited.  In oth
1b450 65 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69  er words, true i
1b460 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1b470 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1b480 20 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69      **    This i
1b490 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66  s always false f
1b4a0 6f 72 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  or the rowid pri
1b4b0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f  mary key index o
1b4c0 66 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  f a table..    *
1b4d0 2a 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69  *    For other i
1b4e0 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72  ndexes, it is tr
1b4f0 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68  ue unless all th
1b500 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
1b510 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
1b520 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
1b530 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ECT statement ar
1b540 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
1b550 20 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a   index (such an.
1b560 20 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20      **    index 
1b570 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73  is sometimes des
1b580 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65  cribed as a cove
1b590 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20  ring index)..   
1b5a0 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70   **    For examp
1b5b0 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e  le, given the in
1b5c0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1b5d0 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65  he second of the
1b5e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1b5f0 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65  **    two querie
1b600 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65  s requires table
1b610 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20   b-tree lookups 
1b620 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64  in order to find
1b630 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
1b640 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63  *    of column c
1b650 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  , but the first 
1b660 64 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65  does not because
1b670 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62   columns a and b
1b680 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62   are.    **    b
1b690 6f 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  oth available in
1b6a0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1b6b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1b6c0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1b6d0 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48  b    FROM tbl WH
1b6e0 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1b6f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1b700 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
1b710 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1b720 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  1;.    */.    in
1b730 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1b740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b750 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1b760 4e 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  N terms matching
1b770 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1b780 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20  t bInEst = 0;   
1b790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b7a0 72 75 65 20 69 66 20 22 78 20 49 4e 20 28 53 45  rue if "x IN (SE
1b7b0 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a  LECT...)" seen *
1b7c0 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c  /.    int nInMul
1b7d0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1b7e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b7f0 20 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69   distinct equali
1b800 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a  ties to lookup *
1b810 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 61 6e  /.    double ran
1b820 67 65 44 69 76 20 3d 20 28 64 6f 75 62 6c 65 29  geDiv = (double)
1b830 31 3b 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64  1;  /* Estimated
1b840 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65   reduction in se
1b850 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20  arch space */.  
1b860 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30    int nBound = 0
1b870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e  /* Number of ran
1b890 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1b8a0 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  een */.    int b
1b8b0 53 6f 72 74 20 3d 20 21 21 70 4f 72 64 65 72 42  Sort = !!pOrderB
1b8c0 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  y;       /* True
1b8d0 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72   if external sor
1b8e0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
1b8f0 20 20 69 6e 74 20 62 44 69 73 74 20 3d 20 21 21    int bDist = !!
1b900 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
1b910 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78  /* True if index
1b920 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74   cannot help wit
1b930 68 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  h DISTINCT */.  
1b940 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20    int bLookup = 
1b950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b960 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61  /* True if not a
1b970 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1b980 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1b990 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1b9a0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1b9b0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1b9c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1b9d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1b9e0 45 5f 53 54 41 54 33 0a 20 20 20 20 57 68 65 72  E_STAT3.    Wher
1b9f0 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1ba00 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1ba10 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1ba20 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1ba30 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74  ndif..    /* Det
1ba40 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1ba50 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e  s of nEq and nIn
1ba60 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  Mul */.    for(n
1ba70 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65  Eq=0; nEq<pProbe
1ba80 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b  ->nColumn; nEq++
1ba90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
1baa0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1bab0 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54  n[nEq];.      pT
1bac0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
1bad0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1bae0 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
1baf0 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
1bb00 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
1bb10 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c  reak;.      wsFl
1bb20 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1bb30 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1bb40 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 74  WID_EQ);.      t
1bb50 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1bb60 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1bb70 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1bb80 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1bb90 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1bba0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1bbb0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73  Expr;.        ws
1bbc0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1bbd0 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
1bbe0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1bbf0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1bc00 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1bc10 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1bc20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
1bc30 20 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45   Assume the SELE
1bc40 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
1bc50 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ws */.          
1bc60 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20  nInMul *= 25;.  
1bc70 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d          bInEst =
1bc80 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
1bc90 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
1bca0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
1bcb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1bcc0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1bcd0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
1bce0 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
1bcf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49   */.          nI
1bd00 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78  nMul *= pExpr->x
1bd10 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
1bd20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bd30 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
1bd40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1bd50 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
1bd60 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1bd70 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1bd80 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1bd90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1bda0 33 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  3.      if( nEq=
1bdb0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 53  =0 && pProbe->aS
1bdc0 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54 65  ample ) pFirstTe
1bdd0 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64  rm = pTerm;.#end
1bde0 69 66 0a 20 20 20 20 20 20 75 73 65 64 20 7c 3d  if.      used |=
1bdf0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1be00 67 68 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ght;.    }..    
1be10 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
1be20 20 76 61 6c 75 65 20 6f 66 20 72 61 6e 67 65 44   value of rangeD
1be30 69 76 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  iv */.    if( nE
1be40 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
1be50 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e  n && pProbe->bUn
1be60 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20  ordered==0 ){.  
1be70 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
1be80 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
1be90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e  ];.      if( fin
1bea0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1beb0 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
1bec0 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1bed0 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a  WO_GE, pIdx) ){.
1bee0 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
1bef0 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54 65  m *pTop = findTe
1bf00 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1bf10 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
1bf20 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20  |WO_LE, pIdx);. 
1bf30 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
1bf40 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72   *pBtm = findTer
1bf50 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
1bf60 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
1bf70 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20  WO_GE, pIdx);.  
1bf80 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
1bf90 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1bfa0 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74  pProbe, nEq, pBt
1bfb0 6d 2c 20 70 54 6f 70 2c 20 26 72 61 6e 67 65 44  m, pTop, &rangeD
1bfc0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
1bfd0 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20   pTop ){.       
1bfe0 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20     nBound = 1;. 
1bff0 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
1c000 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
1c010 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75  MIT;.          u
1c020 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65  sed |= pTop->pre
1c030 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
1c040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1c050 6f 70 2d 3e 70 57 43 21 3d 70 57 43 20 29 3b 0a  op->pWC!=pWC );.
1c060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c070 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20    if( pBtm ){.  
1c080 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b          nBound++
1c090 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  ;.          wsFl
1c0a0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
1c0b0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
1c0c0 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e    used |= pBtm->
1c0d0 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
1c0e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1c0f0 20 70 42 74 6d 2d 3e 70 57 43 21 3d 70 57 43 20   pBtm->pWC!=pWC 
1c100 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c110 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c120 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
1c130 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  NGE|WHERE_ROWID_
1c140 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a  RANGE);.      }.
1c150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
1c160 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1c170 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1c180 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
1c190 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1c1a0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
1c1b0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
1c1c0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1c1d0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1c1e0 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
1c1f0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1c200 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
1c210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  =0 ){.        ws
1c220 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1c230 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20  NIQUE;.      }. 
1c240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c250 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1c260 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
1c270 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
1c280 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a  considered will.
1c290 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79      ** naturally
1c2a0 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68   scan rows in th
1c2b0 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65 72  e required order
1c2c0 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70  , set the approp
1c2d0 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20  riate flags.    
1c2e0 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f  ** in wsFlags. O
1c2f0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1c300 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1c310 59 20 63 6c 61 75 73 65 20 62 75 74 20 74 68 65  Y clause but the
1c320 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69   index.    ** wi
1c330 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20  ll scan rows in 
1c340 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
1c350 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74  r, set the bSort
1c360 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
1c370 20 20 20 69 66 28 20 69 73 53 6f 72 74 69 6e 67     if( isSorting
1c380 49 6e 64 65 78 28 0a 20 20 20 20 20 20 20 20 20  Index(.         
1c390 20 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 70 4d   pParse, pWC->pM
1c3a0 61 73 6b 53 65 74 2c 20 70 50 72 6f 62 65 2c 20  askSet, pProbe, 
1c3b0 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
1c3c0 6e 45 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72  nEq, wsFlags, &r
1c3d0 65 76 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ev).    ){.     
1c3e0 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   bSort = 0;.    
1c3f0 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1c400 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
1c410 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1c420 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  E|WHERE_ORDERBY;
1c430 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
1c440 3d 20 28 72 65 76 20 3f 20 57 48 45 52 45 5f 52  = (rev ? WHERE_R
1c450 45 56 45 52 53 45 20 3a 20 30 29 3b 0a 20 20 20  EVERSE : 0);.   
1c460 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1c470 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1c480 54 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20  T qualifier and 
1c490 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20  this index will 
1c4a0 73 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20  scan rows in.   
1c4b0 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65   ** order of the
1c4c0 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
1c4d0 73 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69  sions, clear bDi
1c4e0 73 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 61  st and set the a
1c4f0 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a  ppropriate.    *
1c500 2a 20 66 6c 61 67 73 20 69 6e 20 77 73 46 6c 61  * flags in wsFla
1c510 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  gs. */.    if( i
1c520 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1c530 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1c540 62 65 2c 20 69 43 75 72 2c 20 70 44 69 73 74 69  be, iCur, pDisti
1c550 6e 63 74 2c 20 6e 45 71 29 20 29 7b 0a 20 20 20  nct, nEq) ){.   
1c560 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20     bDist = 0;.  
1c570 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1c580 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1c590 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1c5a0 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  NGE|WHERE_DISTIN
1c5b0 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CT;.    }..    /
1c5c0 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63  * If currently c
1c5d0 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
1c5e0 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
1c5f0 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49  index (not the I
1c600 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29  PK.    ** index)
1c610 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  , determine if a
1c620 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  ll required colu
1c630 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f  mn data may be o
1c640 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
1c650 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
1c660 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e  e main table (i.
1c670 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  e. if the index 
1c680 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20  is a covering.  
1c690 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74    ** index for t
1c6a0 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69  his query). If i
1c6b0 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48  t is, set the WH
1c6c0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61  ERE_IDX_ONLY fla
1c6d0 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c  g in.    ** wsFl
1c6e0 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ags. Otherwise, 
1c6f0 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20  set the bLookup 
1c700 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65  variable to true
1c710 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  .  */.    if( pI
1c720 64 78 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b  dx && wsFlags ){
1c730 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1c740 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
1c750 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
1c760 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1c770 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
1c780 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
1c790 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
1c7a0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
1c7b0 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20  if( x<BMS-1 ){. 
1c7c0 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28           m &= ~(
1c7d0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29  ((Bitmask)1)<<x)
1c7e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c7f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d    }.      if( m=
1c800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  =0 ){.        ws
1c810 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
1c820 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
1c830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c  else{.        bL
1c840 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  ookup = 1;.     
1c850 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1c860 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65  .    ** Estimate
1c870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1c880 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  ows of output.  
1c890 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45  For an "x IN (SE
1c8a0 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  LECT...)".    **
1c8b0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20   constraint, do 
1c8c0 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69  not let the esti
1c8d0 6d 61 74 65 20 65 78 63 65 65 64 20 68 61 6c 66  mate exceed half
1c8e0 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
1c8f0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
1c900 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c     nRow = (doubl
1c910 65 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d  e)(aiRowEst[nEq]
1c920 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   * nInMul);.    
1c930 69 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52  if( bInEst && nR
1c940 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d  ow*2>aiRowEst[0]
1c950 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   ){.      nRow =
1c960 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a   aiRowEst[0]/2;.
1c970 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28        nInMul = (
1c980 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f  int)(nRow / aiRo
1c990 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20  wEst[nEq]);.    
1c9a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1c9b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
1c9c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73    /* If the cons
1c9d0 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65  traint is of the
1c9e0 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f 72   form x=VALUE or
1c9f0 20 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e 2e   x IN (E1,E2,...
1ca00 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20  ).    ** and we 
1ca10 64 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68 61  do not think tha
1ca20 74 20 76 61 6c 75 65 73 20 6f 66 20 78 20 61 72  t values of x ar
1ca30 65 20 75 6e 69 71 75 65 20 61 6e 64 20 69 66 20  e unique and if 
1ca40 68 69 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a  histogram.    **
1ca50 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
1ca60 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c  le for column x,
1ca70 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62   then it might b
1ca80 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  e possible.    *
1ca90 2a 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  * to get a bette
1caa0 72 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68  r estimate on th
1cab0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1cac0 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a   based on.    **
1cad0 20 56 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63   VALUE and how c
1cae0 6f 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65  ommon that value
1caf0 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   is according to
1cb00 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a   the histogram..
1cb10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1cb20 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26  Row>(double)1 &&
1cb30 20 6e 45 71 3d 3d 31 20 26 26 20 70 46 69 72 73   nEq==1 && pFirs
1cb40 74 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f  tTerm!=0 && aiRo
1cb50 77 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20  wEst[1]>1 ){.   
1cb60 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
1cb70 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1cb80 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1cb90 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 21 3d 30 20  NULL|WO_IN))!=0 
1cba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  );.      if( pFi
1cbb0 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1cbc0 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  or & (WO_EQ|WO_I
1cbd0 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  SNULL) ){.      
1cbe0 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72    testcase( pFir
1cbf0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1cc00 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
1cc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46      testcase( pF
1cc20 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1cc30 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
1cc40 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45  ;.        whereE
1cc50 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72  qualScanEst(pPar
1cc60 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1cc70 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  stTerm->pExpr->p
1cc80 52 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20  Right, &nRow);. 
1cc90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
1cca0 49 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  InEst==0 ){.    
1ccb0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
1ccc0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1ccd0 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
1cce0 20 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e 45      whereInScanE
1ccf0 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1cd00 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70  e, pFirstTerm->p
1cd10 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  Expr->x.pList, &
1cd20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nRow);.      }. 
1cd30 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1cd40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1cd50 54 33 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64  T3 */..    /* Ad
1cd60 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20  just the number 
1cd70 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 61  of output rows a
1cd80 6e 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72  nd downward to r
1cd90 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20  eflect rows.    
1cda0 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c  ** that are excl
1cdb0 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f  uded by range co
1cdc0 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
1cdd0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 52 6f  /.    nRow = nRo
1cde0 77 2f 72 61 6e 67 65 44 69 76 3b 0a 20 20 20 20  w/rangeDiv;.    
1cdf0 69 66 28 20 6e 52 6f 77 3c 31 20 29 20 6e 52 6f  if( nRow<1 ) nRo
1ce00 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 45  w = 1;..    /* E
1ce10 78 70 65 72 69 6d 65 6e 74 73 20 72 75 6e 20 6f  xperiments run o
1ce20 6e 20 72 65 61 6c 20 53 51 4c 69 74 65 20 64 61  n real SQLite da
1ce30 74 61 62 61 73 65 73 20 73 68 6f 77 20 74 68 61  tabases show tha
1ce40 74 20 74 68 65 20 74 69 6d 65 20 6e 65 65 64 65  t the time neede
1ce50 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 20 61  d.    ** to do a
1ce60 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
1ce70 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f 77 20 69  o locate a row i
1ce80 6e 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  n a table or ind
1ce90 65 78 20 69 73 20 72 6f 75 67 68 6c 79 0a 20 20  ex is roughly.  
1cea0 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29 20 74 69    ** log10(N) ti
1ceb0 6d 65 73 20 74 68 65 20 74 69 6d 65 20 74 6f 20  mes the time to 
1cec0 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65 20 72 6f  move from one ro
1ced0 77 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  w to the next ro
1cee0 77 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  w within.    ** 
1cef0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
1cf00 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 74 69  .  The actual ti
1cf10 6d 65 73 20 63 61 6e 20 76 61 72 79 2c 20 77 69  mes can vary, wi
1cf20 74 68 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20  th the size of. 
1cf30 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 62 65     ** records be
1cf40 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74 61 6e 74  ing an important
1cf50 20 66 61 63 74 6f 72 2e 20 20 42 6f 74 68 20 6d   factor.  Both m
1cf60 6f 76 65 73 20 61 6e 64 20 73 65 61 72 63 68 65  oves and searche
1cf70 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  s are.    ** slo
1cf80 77 65 72 20 77 69 74 68 20 6c 61 72 67 65 72 20  wer with larger 
1cf90 72 65 63 6f 72 64 73 2c 20 70 72 65 73 75 6d 61  records, presuma
1cfa0 62 6c 79 20 62 65 63 61 75 73 65 20 66 65 77 65  bly because fewe
1cfb0 72 20 72 65 63 6f 72 64 73 20 66 69 74 0a 20 20  r records fit.  
1cfc0 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61 67 65    ** on one page
1cfd0 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f 72 65 20   and hence more 
1cfe0 70 61 67 65 73 20 68 61 76 65 20 74 6f 20 62 65  pages have to be
1cff0 20 66 65 74 63 68 65 64 2e 0a 20 20 20 20 2a 2a   fetched..    **
1d000 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 4e 41 4c  .    ** The ANAL
1d010 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  YZE command and 
1d020 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
1d030 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
1d040 32 20 74 61 62 6c 65 73 20 64 6f 0a 20 20 20 20  2 tables do.    
1d050 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75 73 20 64  ** not give us d
1d060 61 74 61 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  ata on the relat
1d070 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 61 62  ive sizes of tab
1d080 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  le and index rec
1d090 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20 53 6f 20  ords..    ** So 
1d0a0 74 68 69 73 20 63 6f 6d 70 75 74 61 74 69 6f 6e  this computation
1d0b0 20 61 73 73 75 6d 65 73 20 74 61 62 6c 65 20 72   assumes table r
1d0c0 65 63 6f 72 64 73 20 61 72 65 20 61 62 6f 75 74  ecords are about
1d0d0 20 74 77 69 63 65 20 61 73 20 62 69 67 0a 20 20   twice as big.  
1d0e0 20 20 2a 2a 20 61 73 20 69 6e 64 65 78 20 72 65    ** as index re
1d0f0 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a 20 20 20  cords.    */.   
1d100 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
1d110 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
1d120 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AN)==0 ){.      
1d130 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 61  /* The cost of a
1d140 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
1d150 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   is a number of 
1d160 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  move operations 
1d170 65 71 75 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74  equal.      ** t
1d180 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1d190 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1d1a0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1d1b0 20 20 2a 2a 20 57 65 20 61 64 64 20 61 6e 20 61    ** We add an a
1d1c0 64 64 69 74 69 6f 6e 61 6c 20 34 78 20 70 65 6e  dditional 4x pen
1d1d0 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20 74 61 62  alty to full tab
1d1e0 6c 65 20 73 63 61 6e 73 2e 20 20 54 68 69 73 20  le scans.  This 
1d1f0 63 61 75 73 65 73 0a 20 20 20 20 20 20 2a 2a 20  causes.      ** 
1d200 74 68 65 20 63 6f 73 74 20 66 75 6e 63 74 69 6f  the cost functio
1d210 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74 68 65 20  n to err on the 
1d220 73 69 64 65 20 6f 66 20 63 68 6f 6f 73 69 6e 67  side of choosing
1d230 20 61 6e 20 69 6e 64 65 78 20 6f 76 65 72 0a 20   an index over. 
1d240 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 69 6e 67       ** choosing
1d250 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e 20 20 54   a full scan.  T
1d260 68 69 73 20 34 78 20 66 75 6c 6c 2d 73 63 61 6e  his 4x full-scan
1d270 20 70 65 6e 61 6c 74 79 20 69 73 20 61 6e 20 61   penalty is an a
1d280 72 67 75 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  rguable.      **
1d290 20 64 65 63 69 73 69 6f 6e 20 61 6e 64 20 6f 6e   decision and on
1d2a0 65 20 77 68 69 63 68 20 77 65 20 65 78 70 65 63  e which we expec
1d2b0 74 20 74 6f 20 72 65 76 69 73 69 74 20 69 6e 20  t to revisit in 
1d2c0 74 68 65 20 66 75 74 75 72 65 2e 20 20 42 75 74  the future.  But
1d2d0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 73 65 65  .      ** it see
1d2e0 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b 69 6e 67  ms to be working
1d2f0 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20 61 74 20   well enough at 
1d300 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20  the moment..    
1d310 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 73 74 20    */.      cost 
1d320 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2a 34 3b  = aiRowEst[0]*4;
1d330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d340 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73 74 4c 6f    log10N = estLo
1d350 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a  g(aiRowEst[0]);.
1d360 20 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f        cost = nRo
1d370 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  w;.      if( pId
1d380 78 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  x ){.        if(
1d390 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20   bLookup ){.    
1d3a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
1d3b0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 66 6f 6c  index lookup fol
1d3c0 6c 6f 77 65 64 20 62 79 20 61 20 74 61 62 6c 65  lowed by a table
1d3d0 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
1d3e0 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20     **    nInMul 
1d3f0 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20 74  index searches t
1d400 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72 74  o find the start
1d410 20 6f 66 20 65 61 63 68 20 69 6e 64 65 78 20 72   of each index r
1d420 61 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  ange.          *
1d430 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
1d440 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
1d450 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  x.          **  
1d460 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20 73 65 61  + nRow table sea
1d470 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20  rches to lookup 
1d480 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
1d490 75 73 69 6e 67 20 74 68 65 20 72 6f 77 69 64 0a  using the rowid.
1d4a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1d4b0 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 28         cost += (
1d4c0 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77 29 2a 6c  nInMul + nRow)*l
1d4d0 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d  og10N;.        }
1d4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d4f0 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65 72 69 6e  /* For a coverin
1d500 67 20 69 6e 64 65 78 3a 0a 20 20 20 20 20 20 20  g index:.       
1d510 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e 4d 75 6c     **     nInMul
1d520 20 69 6e 64 65 78 20 73 65 61 72 63 68 65 73 20   index searches 
1d530 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74  to find the init
1d540 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
1d550 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e 52 6f 77       **   + nRow
1d560 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1d570 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1d580 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d590 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c  cost += nInMul*l
1d5a0 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20 20 20 7d  og10N;.        }
1d5b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d5c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 72        /* For a r
1d5d0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
1d5e0 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20 20 20 20   lookup:.       
1d5f0 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 74 20 74   **    nInMult t
1d600 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f  able searches to
1d610 20 66 69 6e 64 20 74 68 65 20 69 6e 69 74 69 61   find the initia
1d620 6c 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  l entry for each
1d630 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
1d640 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20  *  + nRow steps 
1d650 74 68 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c  through the tabl
1d660 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
1d670 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e       cost += nIn
1d680 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
1d690 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d6a0 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65 73 74  * Add in the est
1d6b0 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73  imated cost of s
1d6c0 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  orting the resul
1d6d0 74 2e 20 20 41 63 74 75 61 6c 20 65 78 70 65 72  t.  Actual exper
1d6e0 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  imental.    ** m
1d6f0 65 61 73 75 72 65 6d 65 6e 74 73 20 6f 66 20 73  easurements of s
1d700 6f 72 74 69 6e 67 20 70 65 72 66 6f 72 6d 61 6e  orting performan
1d710 63 65 20 69 6e 20 53 51 4c 69 74 65 20 73 68 6f  ce in SQLite sho
1d720 77 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 74  w that sorting t
1d730 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64 64 73 20  ime.    ** adds 
1d740 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20 74 6f 20  C*N*log10(N) to 
1d750 74 68 65 20 63 6f 73 74 2c 20 77 68 65 72 65 20  the cost, where 
1d760 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1d770 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 0a 20  of rows to be . 
1d780 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 61 6e 64     ** sorted and
1d790 20 43 20 69 73 20 61 20 66 61 63 74 6f 72 20 62   C is a factor b
1d7a0 65 74 77 65 65 6e 20 31 2e 39 35 20 61 6e 64 20  etween 1.95 and 
1d7b0 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c 20 73 70  4.3.  We will sp
1d7c0 6c 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  lit the.    ** d
1d7d0 69 66 66 65 72 65 6e 63 65 20 61 6e 64 20 73 65  ifference and se
1d7e0 6c 65 63 74 20 43 20 6f 66 20 33 2e 30 2e 0a 20  lect C of 3.0.. 
1d7f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53     */.    if( bS
1d800 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73  ort ){.      cos
1d810 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67  t += nRow*estLog
1d820 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a  (nRow)*3;.    }.
1d830 20 20 20 20 69 66 28 20 62 44 69 73 74 20 29 7b      if( bDist ){
1d840 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e  .      cost += n
1d850 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29  Row*estLog(nRow)
1d860 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  *3;.    }..    /
1d870 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73 69  **** Cost of usi
1d880 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  ng this index ha
1d890 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75  s now been compu
1d8a0 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f  ted ****/..    /
1d8b0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
1d8c0 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72  dditional constr
1d8d0 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74 61  aints on this ta
1d8e0 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a  ble that cannot.
1d8f0 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 77      ** be used w
1d900 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
1d910 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63 68  index, but which
1d920 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68 65   might lower the
1d930 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f   number.    ** o
1d940 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61  f output rows, a
1d950 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20 76  djust the nRow v
1d960 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  alue accordingly
1d970 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20  .  This only .  
1d980 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66 20    ** matters if 
1d990 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65  the current inde
1d9a0 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20 63  x is the least c
1d9b0 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74  ostly, so do not
1d9c0 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   bother.    ** w
1d9d0 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69 66  ith this step if
1d9e0 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
1d9f0 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c   this index will
1da00 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a   not be chosen..
1da10 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76      ** Also, nev
1da20 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f 75  er reduce the ou
1da30 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62  tput row count b
1da40 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68 69  elow 2 using thi
1da50 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20  s step..    **. 
1da60 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69 74     ** It is crit
1da70 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e 6f  ical that the no
1da80 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20 75  tValid mask be u
1da90 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64  sed here instead
1daa0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e   of.    ** the n
1dab0 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20 57  otReady mask.  W
1dac0 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e  hen computing an
1dad0 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65 78   "optimal" index
1dae0 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a 20  , the notReady. 
1daf0 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20     ** mask will 
1db00 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62 69  only have one bi
1db10 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74 20  t set - the bit 
1db20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1db30 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
1db40 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c  e notValid mask,
1db50 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
1db60 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20 61  nd, always has a
1db70 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72 0a  ll bits set for.
1db80 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
1db90 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75  at are not in ou
1dba0 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e  ter loops.  If n
1dbb0 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64 20  otReady is used 
1dbc0 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20 20  here instead.   
1dbd0 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c   ** of notValid,
1dbe0 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20   then a optimal 
1dbf0 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65 6e  index that depen
1dc00 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e  ds on inner join
1dc10 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d  s loops.    ** m
1dc20 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65 64  ight be selected
1dc30 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
1dc40 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69 6d   exists an optim
1dc50 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  al index that ha
1dc60 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68  s.    ** no such
1dc70 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20   dependency..   
1dc80 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   */.    if( nRow
1dc90 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70 43 6f 73  >2 && cost<=pCos
1dca0 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  t->rCost ){.    
1dcb0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1dce0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69  /.      int nSki
1dcf0 70 45 71 20 3d 20 6e 45 71 3b 20 20 20 20 20 20  pEq = nEq;      
1dd00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dd10 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  f == constraints
1dd20 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20   to skip */.    
1dd30 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65    int nSkipRange
1dd40 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f   = nBound;     /
1dd50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f  * Number of < co
1dd60 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69  nstraints to ski
1dd70 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61  p */.      Bitma
1dd80 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20 20  sk thisTab;     
1dd90 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
1dda0 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20  p for pSrc */.. 
1ddb0 20 20 20 20 20 74 68 69 73 54 61 62 20 3d 20 67       thisTab = g
1ddc0 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73  etMask(pWC->pMas
1ddd0 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20  kSet, iCur);.   
1dde0 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
1ddf0 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
1de00 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b 3b 20  m; nRow>2 && k; 
1de10 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k--, pTerm++){. 
1de20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
1de30 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1de40 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69  _VIRTUAL ) conti
1de50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1de60 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
1de70 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29 21 3d  ll & notValid)!=
1de80 74 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e  thisTab ) contin
1de90 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1dea0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1deb0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c   & (WO_EQ|WO_IN|
1dec0 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20  WO_ISNULL) ){.  
1ded0 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69          if( nSki
1dee0 70 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pEq ){.         
1def0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
1df00 20 66 69 72 73 74 20 6e 45 71 20 65 71 75 61 6c   first nEq equal
1df10 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e 63  ity matches sinc
1df20 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  e the index.    
1df30 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
1df40 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64  lready accounted
1df50 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20   for these */.  
1df60 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 45            nSkipE
1df70 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  q--;.          }
1df80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1df90 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
1dfa0 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75 61   additional equa
1dfb0 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75 63  lity match reduc
1dfc0 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  es the result.  
1dfd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
1dfe0 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f   size by a facto
1dff0 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20 20  r of 10 */.     
1e000 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 31         nRow /= 1
1e010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
1e020 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e030 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1e040 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  r & (WO_LT|WO_LE
1e050 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  |WO_GT|WO_GE) ){
1e060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
1e070 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20  SkipRange ){.   
1e080 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
1e090 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  re the first nSk
1e0a0 69 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f  ipRange range co
1e0b0 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20  nstraints since 
1e0c0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
1e0d0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72        ** has alr
1e0e0 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66  eady accounted f
1e0f0 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20  or these */.    
1e100 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e          nSkipRan
1e110 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ge--;.          
1e120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e130 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63     /* Assume eac
1e140 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e  h additional ran
1e150 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  ge constraint re
1e160 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74  duces the result
1e170 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e180 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61  set size by a fa
1e190 63 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65  ctor of 3.  Inde
1e1a0 78 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  xed range constr
1e1b0 61 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20  aints reduce.   
1e1c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1e1d0 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
1e1e0 61 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a  a larger factor:
1e1f0 20 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64   4.  We make ind
1e200 65 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20  exed range.     
1e210 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73         ** more s
1e220 65 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69  elective intenti
1e230 6f 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f  onally because o
1e240 66 20 74 68 65 20 73 75 62 6a 65 63 74 69 76 65  f the subjective
1e250 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
1e260 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61   observation tha
1e270 74 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20  t indexed range 
1e280 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c  constraints real
1e290 6c 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20  ly are more.    
1e2a0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63          ** selec
1e2b0 74 69 76 65 20 69 6e 20 70 72 61 63 74 69 63 65  tive in practice
1e2c0 2c 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f  , on average. */
1e2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f  .            nRo
1e2e0 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  w /= 3;.        
1e2f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e300 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1e310 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50 20  erator!=WO_NOOP 
1e320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1e330 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
1e340 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65 20  sion lowers the 
1e350 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74  output row count
1e360 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20 20   by half */.    
1e370 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 32 3b        nRow /= 2;
1e380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f   }.      if( nRo
1e3a0 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32 3b 0a  w<2 ) nRow = 2;.
1e3b0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52      }...    WHER
1e3c0 45 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22  ETRACE((.      "
1e3d0 25 73 28 25 73 29 3a 20 6e 45 71 3d 25 64 20 6e  %s(%s): nEq=%d n
1e3e0 49 6e 4d 75 6c 3d 25 64 20 72 61 6e 67 65 44 69  InMul=%d rangeDi
1e3f0 76 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62 4c  v=%d bSort=%d bL
1e400 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67 73  ookup=%d wsFlags
1e410 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20 20 20 22  =0x%x\n".      "
1e420 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64           notRead
1e430 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d  y=0x%llx log10N=
1e440 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20 63  %.1f nRow=%.1f c
1e450 6f 73 74 3d 25 2e 31 66 20 75 73 65 64 3d 30 78  ost=%.1f used=0x
1e460 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 70  %llx\n",.      p
1e470 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
1e480 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d 3e  , (pIdx ? pIdx->
1e490 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c 20  zName : "ipk"), 
1e4a0 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e 4d  .      nEq, nInM
1e4b0 75 6c 2c 20 28 69 6e 74 29 72 61 6e 67 65 44 69  ul, (int)rangeDi
1e4c0 76 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75  v, bSort, bLooku
1e4d0 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20 20 20  p, wsFlags,.    
1e4e0 20 20 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31    notReady, log1
1e4f0 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20  0N, nRow, cost, 
1e500 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20  used.    ));..  
1e510 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1e520 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ex is the best w
1e530 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66  e have seen so f
1e540 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  ar, then record 
1e550 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65  this.    ** inde
1e560 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  x and its cost i
1e570 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74 72 75  n the pCost stru
1e580 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
1e590 20 20 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20    if( (!pIdx || 
1e5a0 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20 26 26  wsFlags).     &&
1e5b0 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43   (cost<pCost->rC
1e5c0 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43  ost || (cost<=pC
1e5d0 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52  ost->rCost && nR
1e5e0 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  ow<pCost->plan.n
1e5f0 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  Row)).    ){.   
1e600 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
1e610 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
1e620 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64  ost->used = used
1e630 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
1e640 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  lan.nRow = nRow;
1e650 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
1e660 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28 77 73  an.wsFlags = (ws
1e670 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61 73 6b  Flags&wsFlagMask
1e680 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
1e690 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a  plan.nEq = nEq;.
1e6a0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1e6b0 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
1e6c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1e6d0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1e6e0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1e6f0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
1e700 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
1e710 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
1e720 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1e730 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
1e740 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20  ;..    /* Reset 
1e750 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65  masks for the ne
1e760 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  xt index in the 
1e770 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c  loop */.    wsFl
1e780 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
1e790 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1e7a0 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1e7b0 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
1e7c0 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
1e7d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
1e7e0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
1e7f0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 53  clause and the S
1e800 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
1e810 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  er flag.  ** is 
1e820 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73  set, then revers
1e830 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74  e the order that
1e840 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
1e850 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20  be scanned.  ** 
1e860 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  in. This is used
1e870 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   for application
1e880 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c   testing, to hel
1e890 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a  p find cases.  *
1e8a0 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61 74  * where applicat
1e8b0 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65  ion behaviour de
1e8c0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e  pends on the (un
1e8d0 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74  defined) order t
1e8e0 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hat.  ** SQLite 
1e8f0 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
1e900 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  in the absence o
1e910 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  f an ORDER BY cl
1e920 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
1e930 21 70 4f 72 64 65 72 42 79 20 26 26 20 70 50 61  !pOrderBy && pPa
1e940 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1e950 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1e960 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43 6f 73  rder ){.    pCos
1e970 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1e980 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
1e990 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1e9a0 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 43   pOrderBy || (pC
1e9b0 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1e9c0 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
1e9d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1e9e0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1e9f0 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74  Idx==0 || (pCost
1ea00 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1ea10 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d  HERE_ROWID_EQ)==
1ea20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ea30 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
1ea40 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d         || pCost-
1ea50 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
1ea60 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74  .       || pCost
1ea70 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  ->plan.u.pIdx==p
1ea80 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29  Src->pIndex .  )
1ea90 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
1eaa0 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a  ("best index is:
1eab0 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70   %s\n", .    ((p
1eac0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1ead0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1eae0 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e  ULLSCAN)==0 ? "n
1eaf0 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20 20 20  one" : .        
1eb00 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1eb10 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61  Idx ? pCost->pla
1eb20 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  n.u.pIdx->zName 
1eb30 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20  : "ipk").  ));. 
1eb40 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65   .  bestOrClause
1eb50 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1eb60 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1eb70 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1eb80 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20  derBy, pCost);. 
1eb90 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
1eba0 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1ebb0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1ebc0 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74   pCost);.  pCost
1ebd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
1ebe0 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a  = eqTermMask;.}.
1ebf0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1ec00 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
1ec10 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20 70  ccessing table p
1ec20 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74 65  Src->pTab. Write
1ec30 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
1ec40 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
1ec50 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68  cost into the Wh
1ec60 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73  ereCost object s
1ec70 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74  upplied .** as t
1ec80 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  he last paramete
1ec90 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1eca0 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20 74   may calculate t
1ecb0 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f  he cost of.** bo
1ecc0 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72 74  th real and virt
1ecd0 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ual table scans.
1ece0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ecf0 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
1ed00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1ed10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ed20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1ed30 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1ed40 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
1ed50 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1ed60 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1ed70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ed80 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
1ed90 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1eda0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
1edb0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
1edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1edd0 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20   of cursors not 
1ede0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e  available for in
1edf0 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
1ee00 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
1ee10 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1ee20 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
1ee30 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
1ee40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1ee50 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
1ee60 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1ee70 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
1ee80 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
1ee90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
1eea0 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
1eeb0 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  lan */.){.#ifnde
1eec0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1eed0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
1eee0 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d   IsVirtual(pSrc-
1eef0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
1ef00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1ef10 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73   *p = 0;.    bes
1ef20 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
1ef30 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1ef40 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
1ef50 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  lid, pOrderBy, p
1ef60 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20 69 66  Cost,&p);.    if
1ef70 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1ef80 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73  dxStr ){.      s
1ef90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69  qlite3_free(p->i
1efa0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dxStr);.    }.  
1efb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1efc0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1efd0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1efe0 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65   {.    bestBtree
1eff0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1f000 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1f010 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1f020 64 65 72 42 79 2c 20 30 2c 20 70 43 6f 73 74 29  derBy, 0, pCost)
1f030 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1f040 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
1f050 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f060 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
1f070 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
1f080 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
1f090 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
1f0a0 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
1f0b0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
1f0c0 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
1f0d0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1f0e0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
1f0f0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
1f100 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
1f110 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
1f120 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
1f130 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
1f140 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f150 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
1f160 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
1f170 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
1f180 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
1f190 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
1f1a0 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
1f1b0 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
1f1c0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
1f1d0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
1f1e0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
1f1f0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
1f200 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
1f210 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
1f220 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
1f230 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
1f240 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
1f250 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
1f260 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
1f270 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
1f280 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
1f290 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
1f2a0 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
1f2b0 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  isabled..**.** I
1f2c0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1f2d0 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20  : R-24597-58655 
1f2e0 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e  No tests are don
1f2f0 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  e for terms that
1f300 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65   are.** complete
1f310 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ly satisfied by 
1f320 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44  indices..**.** D
1f330 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
1f340 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
1f350 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
1f360 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
1f370 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
1f380 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
1f390 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
1f3a0 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
1f3b0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1f3c0 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
1f3d0 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
1f3e0 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
1f3f0 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
1f400 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
1f410 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
1f420 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
1f430 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
1f440 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
1f450 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
1f460 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1f470 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
1f480 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
1f490 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
1f4a0 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
1f4b0 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
1f4c0 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
1f4d0 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
1f4e0 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
1f4f0 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
1f500 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
1f510 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
1f520 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
1f530 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
1f540 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
1f550 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
1f560 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1f570 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
1f580 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
1f590 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
1f5a0 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1f5b0 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
1f5c0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
1f5d0 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
1f5e0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
1f5f0 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
1f600 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
1f610 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1f620 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
1f630 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
1f640 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
1f650 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
1f660 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
1f670 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
1f680 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
1f690 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1f6a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
1f6b0 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
1f6c0 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
1f6d0 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
1f6e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
1f6f0 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
1f700 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
1f710 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
1f720 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
1f730 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
1f740 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
1f750 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
1f760 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
1f770 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
1f780 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
1f790 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
1f7a0 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
1f7b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1f7c0 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
1f7d0 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
1f7e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f7f0 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
1f800 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
1f810 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1f820 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
1f830 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
1f840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1f850 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
1f860 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
1f870 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
1f880 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
1f890 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
1f8a0 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
1f8b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1f8c0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
1f8d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1f8e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1f8f0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1f900 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
1f910 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
1f920 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
1f930 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
1f940 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
1f950 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
1f960 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
1f970 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
1f980 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
1f990 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
1f9a0 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
1f9b0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1f9c0 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
1f9d0 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
1f9e0 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
1f9f0 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
1fa00 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1fa10 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
1fa20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
1fa30 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
1fa40 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
1fa50 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
1fa60 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
1fa70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fa80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
1fa90 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
1faa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fab0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
1fac0 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
1fad0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1fae0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1faf0 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
1fb00 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
1fb10 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1fb20 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
1fb30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1fb40 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
1fb50 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
1fb60 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
1fb70 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
1fb80 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
1fb90 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
1fba0 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
1fbb0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1fbc0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
1fbd0 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
1fbe0 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
1fbf0 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
1fc00 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
1fc10 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
1fc20 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
1fc30 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
1fc40 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
1fc50 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
1fc60 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
1fc70 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
1fc80 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
1fc90 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
1fca0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
1fcb0 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
1fcc0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
1fcd0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
1fce0 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
1fcf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1fd00 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1fd10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1fd20 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1fd30 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
1fd40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1fd50 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
1fd60 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1fd70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c  Level, /* When l
1fd80 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
1fd90 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
1fda0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
1fdb0 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
1fdc0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
1fdd0 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
1fde0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1fdf0 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
1fe00 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1fe10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1fe20 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1fe30 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
1fe40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1fe50 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
1fe60 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
1fe70 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
1fe80 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
1fe90 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20  _EQ ){.    iReg 
1fea0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1feb0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1fec0 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pX->pRight, iTar
1fed0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  get);.  }else if
1fee0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  ( pX->op==TK_ISN
1fef0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20  ULL ){.    iReg 
1ff00 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73  = iTarget;.    s
1ff10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ff20 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1ff30 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  iReg);.#ifndef S
1ff40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ff50 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
1ff60 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
1ff70 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74  int iTab;.    st
1ff80 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
1ff90 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
1ffa0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
1ffb0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
1ffc0 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
1ffd0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1ffe0 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
1fff0 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58  );.    iTab = pX
20000 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
20010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20020 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
20030 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
20040 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
20050 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20060 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20  _IN_ABLE );.    
20070 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
20080 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
20090 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
200a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
200b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
200c0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
200d0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
200e0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
200f0 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
20100 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
20110 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
20120 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
20130 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
20160 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
20170 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
20180 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
20190 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
201a0 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
201b0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
201c0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
201d0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
201e0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
201f0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
20200 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
20210 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
20220 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
20230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20240 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
20250 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
20260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
20270 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
20280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
20290 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
202a0 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
202b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
202c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
202d0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
202e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
202f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
20300 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
20310 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
20320 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
20330 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
20340 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
20350 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
20360 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
20370 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
20380 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
20390 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
203a0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
203b0 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
203c0 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
203d0 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
203e0 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
203f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
20400 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
20410 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
20420 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
20430 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
20440 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
20450 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
20460 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
20470 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
20480 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
20490 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
204a0 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
204b0 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
204c0 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
204d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
204e0 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
204f0 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
20500 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
20510 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
20520 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
20530 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
20540 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
20550 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
20560 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
20570 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
20580 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
20590 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
205a0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
205b0 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
205c0 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
205d0 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
205e0 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
205f0 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
20600 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20610 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
20620 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
20630 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
20640 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
20650 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
20660 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
20670 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
20680 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
20690 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
206a0 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
206b0 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
206c0 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e   cell and return
206d0 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
206e0 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
206f0 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ll. The code tha
20700 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
20710 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
20720 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
20730 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  l to store the t
20740 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
20750 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
20760 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
20770 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
20780 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
20790 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
207a0 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
207b0 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
207c0 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
207d0 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
207e0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
207f0 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
20800 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
20810 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
20820 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
20830 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
20840 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
20850 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
20860 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
20870 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
20880 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
20890 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
208a0 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
208b0 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
208c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
208d0 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
208e0 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
208f0 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
20900 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
20910 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
20920 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
20930 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
20940 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
20950 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
20960 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
20970 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
20980 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
20990 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
209a0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
209b0 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
209c0 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
209d0 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
209e0 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
209f0 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
20a00 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
20a10 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
20a20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
20a30 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
20a40 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
20a50 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
20a60 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
20a70 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
20a80 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
20a90 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
20aa0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
20ab0 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
20ac0 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
20ad0 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
20ae0 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
20af0 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
20b00 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
20b10 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
20b20 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
20b30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
20b40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20b50 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
20b60 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
20b70 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
20b80 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
20b90 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
20ba0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
20bb0 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
20bc0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
20bd0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
20be0 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
20bf0 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
20c00 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
20c10 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  coded */.  int n
20c20 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
20c30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
20c40 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
20c50 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
20c60 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
20c70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
20c80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
20c90 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
20ca0 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  ){.  int nEq = p
20cb0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b  Level->plan.nEq;
20cc0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
20cd0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
20ce0 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
20cf0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
20d00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
20d10 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e      /* The vm un
20d20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
20d30 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
20d40 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
20d50 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
20d60 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
20d70 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
20d80 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c  nt iCur = pLevel
20d90 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20  ->iTabCur;   /* 
20da0 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
20db0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
20dc0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
20dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
20de0 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
20df0 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
20e00 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
20e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
20e20 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
20e30 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e50 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f  Base register */
20e60 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20  .  int nReg;    
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
20e90 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
20ea0 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ate */.  char *z
20eb0 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
20ec0 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
20ed0 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74  ty string to ret
20ee0 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  urn */..  /* Thi
20ef0 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79  s module is only
20f00 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79   called on query
20f10 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20   plans that use 
20f20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  an index. */.  a
20f30 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
20f40 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
20f50 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
20f60 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
20f70 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20  plan.u.pIdx;..  
20f80 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
20f90 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
20fa0 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
20fb0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
20fc0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
20fd0 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
20fe0 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
20ff0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
21000 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20  q + nExtraReg;. 
21010 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21020 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d   nReg;..  zAff =
21030 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
21040 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c  (pParse->db, sql
21050 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
21060 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a  yStr(v, pIdx));.
21070 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20    if( !zAff ){. 
21080 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
21090 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
210a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75  .  }..  /* Evalu
210b0 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
210c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
210d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
210e0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29  ->nColumn>=nEq )
210f0 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e  ;.  for(j=0; j<n
21100 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
21110 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20  t r1;.    int k 
21120 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
21130 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  [j];.    pTerm =
21140 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
21150 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
21160 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  , pLevel->plan.w
21170 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20  sFlags, pIdx);. 
21180 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65     if( NEVER(pTe
21190 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  rm==0) ) break;.
211a0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
211b0 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
211c0 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
211d0 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
211e0 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
211f0 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
21200 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
21210 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21220 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
21230 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
21240 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21250 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
21260 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21270 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21280 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
21290 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
212a0 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
212b0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
212c0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
212d0 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
212e0 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
212f0 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
21300 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
21310 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21320 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
21330 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21340 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
21350 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
21360 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21380 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
21390 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
213a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
213b0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
213c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
213d0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
213e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
213f0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
21400 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
21410 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
21420 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
21430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
21440 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
21450 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
21460 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
21470 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
21480 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
21490 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
214a0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
214b0 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
214c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
214d0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
214e0 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
214f0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
21500 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
21510 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
21520 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
21530 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21540 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
21550 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
21560 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
21570 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
21580 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
21590 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
215a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
215b0 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
215c0 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
215d0 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
215e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
215f0 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
21600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
21610 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
21620 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
21630 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
21640 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
21650 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
21660 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
21670 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
21680 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
21690 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
216a0 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
216b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
216c0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
216d0 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
216e0 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
216f0 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
21700 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
21710 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
21720 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
21730 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
21740 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
21750 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
21760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
21770 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
21780 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
21790 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
217a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
217b0 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
217c0 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
217d0 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
217e0 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
217f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21800 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
21810 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
21820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21830 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
21840 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
21850 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
21860 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
21870 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
21880 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21890 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
218a0 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
218b0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
218c0 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
218d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
218e0 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
218f0 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
21900 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
21910 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
21920 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
21930 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
21940 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
21950 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
21960 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
21970 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
21980 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
21990 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
219a0 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
219b0 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
219c0 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
219d0 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
219e0 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
219f0 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
21a00 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
21a10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
21a20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
21a30 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
21a40 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
21a50 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
21a60 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
21a70 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
21a80 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
21a90 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
21aa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
21ab0 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
21ac0 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
21ad0 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
21ae0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
21af0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
21b00 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
21b10 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
21b20 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
21b30 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
21b40 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
21b50 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
21b60 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
21b70 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
21b80 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
21b90 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
21ba0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
21bb0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
21bc0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
21bd0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
21be0 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
21bf0 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
21c00 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
21c10 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
21c20 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
21c30 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
21c40 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
21c50 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
21c60 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
21c70 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
21c80 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
21c90 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
21ca0 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
21cb0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
21cc0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
21cd0 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
21ce0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
21cf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
21d00 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
21d10 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
21d20 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
21d30 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
21d40 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
21d50 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
21d60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
21d70 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
21d80 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
21d90 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
21da0 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
21db0 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
21dc0 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
21dd0 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
21de0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
21df0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
21e00 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 61 43  rm(&txt, i++, aC
21e10 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
21e20 7a 4e 61 6d 65 2c 20 22 3e 22 29 3b 0a 20 20 7d  zName, ">");.  }
21e30 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73  .  if( pPlan->ws
21e40 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  Flags&WHERE_TOP_
21e50 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70  LIMIT ){.    exp
21e60 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
21e70 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
21e80 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[j]].zName,
21e90 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
21ea0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
21eb0 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
21ec0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
21ed0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
21ee0 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
21ef0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21f00 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
21f10 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
21f20 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
21f30 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
21f40 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
21f50 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
21f60 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
21f70 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
21f80 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
21f90 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
21fa0 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
21fb0 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
21fc0 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
21fd0 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
21fe0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
21ff0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
22000 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
22010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22020 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
22030 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
22040 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
22050 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
22060 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
22070 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
22080 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
22090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
220a0 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
220b0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
220c0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
220f0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
22100 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
22110 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
22140 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
22150 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
22160 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
22170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
22180 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
22190 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
221a0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
221b0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
221c0 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  ){.    u32 flags
221d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
221e0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72  wsFlags;.    str
221f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22200 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
22210 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
22220 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
22230 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
22240 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
22250 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
22260 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
22270 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
22280 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
22290 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
222a0 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
222c0 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
222d0 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
222e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
222f0 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
22300 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
22310 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
22320 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20  ed by scan */.  
22330 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
22340 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
22350 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
22360 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
22370 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
22380 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
22390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
223a0 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
223b0 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
223c0 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66  . */..    if( (f
223d0 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
223e0 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
223f0 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
22400 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
22410 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
22420 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
22430 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20  .nEq>0).        
22440 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28       || (flags&(
22450 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
22460 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
22470 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
22480 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
22490 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
224a0 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
224b0 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
224c0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
224d0 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
224e0 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
224f0 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
22500 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
22510 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
22520 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22530 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
22540 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
22550 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
22560 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
22570 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
22580 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
22590 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
225a0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
225b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
225c0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
225d0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
225e0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
225f0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
22600 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
22610 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
22620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22630 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
22640 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
22650 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
22660 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
22670 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c  Range(db, pLevel
22680 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
22690 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
226a0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
226b0 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
226c0 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25 73   %s%sINDEX%s%s%s
226d0 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20  ", zMsg, .      
226e0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
226f0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
22700 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29  "AUTOMATIC ":"")
22710 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
22720 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
22730 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20  ONLY)?"COVERING 
22740 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
22750 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
22760 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
22770 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  " "),.          
22780 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
22790 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20  TEMP_INDEX)?"": 
227a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
227b0 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  Idx->zName),.   
227c0 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20         zWhere.  
227d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
227e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
227f0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
22800 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 57  e if( flags & (W
22810 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
22820 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
22830 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
22840 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
22850 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
22860 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
22870 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
22880 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
22890 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
228a0 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Q ){.        zMs
228b0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
228c0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
228d0 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
228e0 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
228f0 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
22900 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
22910 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
22920 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22930 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22940 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22950 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
22960 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
22970 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
22980 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
22990 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
229a0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
229b0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
229c0 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
229d0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
229e0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
229f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
22a00 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
22a10 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22a20 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
22a30 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
22a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
22a50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22a60 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
22a70 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
22a80 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
22a90 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
22aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
22ab0 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
22ac0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
22ad0 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20  n.u.pVtabIdx;.  
22ae0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22af0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22b00 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
22b10 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
22b20 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
22b40 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70  abIdx->idxNum, p
22b50 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29  VtabIdx->idxStr)
22b60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22b70 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
22b80 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
22b90 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
22ba0 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20  BY_MAX) ){.     
22bb0 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
22bc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
22bd0 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20  DERBY_MIN );.   
22be0 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20     nRow = 1;.   
22bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
22c00 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ow = (sqlite3_in
22c10 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  t64)pLevel->plan
22c20 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20  .nRow;.    }.   
22c30 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22c40 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22c50 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77  , "%s (~%lld row
22c60 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29  s)", zMsg, nRow)
22c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22c80 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
22c90 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
22ca0 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
22cb0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
22cc0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
22cd0 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ne explainOneSca
22ce0 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  n(u,v,w,x,y,z).#
22cf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22d00 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
22d10 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22d20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74   code for the st
22d30 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65  art of the iLeve
22d40 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65  l-th loop in the
22d50 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
22d60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22d70 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49  described by pWI
22d80 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  nfo..*/.static B
22d90 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f  itmask codeOneLo
22da0 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65  opStart(.  Where
22db0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
22dc0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f  /* Complete info
22dd0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
22de0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
22df0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
22e00 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
22e10 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66  h level of pWInf
22e20 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65  o->a[] should be
22e30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20   coded */.  u16 
22e40 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
22e50 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
22e60 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
22e70 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
22e80 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  t.h */.  Bitmask
22e90 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 2f 2a   notReady,    /*
22ea0 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
22eb0 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
22ec0 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  lable */.  Expr 
22ed0 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  *pWhere         
22ee0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 57 48 45 52  /* Complete WHER
22ef0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20  E clause */.){. 
22f00 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20   int j, k;      
22f10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22f20 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
22f30 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
22f40 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
22f50 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
22f60 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  e */.  int addrN
22f70 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  xt;         /* W
22f80 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
22f90 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
22fa0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
22fb0 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c  /.  int omitTabl
22fc0 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
22fd0 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
22fe0 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  ndex only */.  i
22ff0 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
23000 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
23010 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
23020 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
23030 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
23040 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65  *pLevel;  /* The
23050 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20   where level to 
23060 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
23070 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
23080 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
23090 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
230a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
230b0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
230c0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
230d0 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
230e0 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
230f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23120 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  xt */.  Vdbe *v;
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23150 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64  repared stmt und
23160 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73  er constructions
23170 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
23180 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
23190 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  tem;  /* FROM cl
231a0 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
231b0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  coded */.  int a
231c0 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20  ddrBrk;         
231d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
231e0 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
231f0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
23200 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
23210 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
23220 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
23230 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
23240 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  ith next cycle *
23250 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65  /.  int iRowidRe
23260 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
23270 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64   Rowid is stored
23280 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
23290 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a  r, if not zero *
232a0 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65  /.  int iRelease
232b0 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Reg = 0;      /*
232c0 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
232d0 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65  o free before re
232e0 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50  turning */..  pP
232f0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
23300 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61  Parse;.  v = pPa
23310 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57  rse->pVdbe;.  pW
23320 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b  C = pWInfo->pWC;
23330 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
23340 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
23350 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
23360 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
23370 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
23380 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
23390 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
233a0 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  bRev = (pLevel->
233b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
233c0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
233d0 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20  ;.  omitTable = 
233e0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
233f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
23400 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20  X_ONLY)!=0 .    
23410 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
23420 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f  Flags & WHERE_FO
23430 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a  RCE_TABLE)==0;..
23440 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
23450 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61  ls for the "brea
23460 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65  k" and "continue
23470 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20  " instructions. 
23480 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72   ** for the curr
23490 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20  ent loop.  Jump 
234a0 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72  to addrBrk to br
234b0 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
234c0 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20  p..  ** Jump to 
234d0 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64  cont to go immed
234e0 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65  iately to the ne
234f0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
23500 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20  the.  ** loop.. 
23510 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68   **.  ** When th
23520 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
23530 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
23540 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20  ave a "addrNxt" 
23550 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20  label that.  ** 
23560 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
23570 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
23580 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
23590 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a  tion.  When.  **
235a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
235b0 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
235c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
235d0 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62  he "addrNxt" lab
235e0 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73  el.  ** is the s
235f0 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22  ame as "addrBrk"
23600 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b  ..  */.  addrBrk
23610 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
23620 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
23630 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
23640 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23650 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65    addrCont = pLe
23660 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20  vel->addrCont = 
23670 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23680 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  abel(v);..  /* I
23690 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
236a0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
236b0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
236c0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a  allocate and.  *
236d0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
236e0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
236f0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
23700 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
23710 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68  y.  ** row of th
23720 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
23730 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
23740 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
23750 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
23760 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
23770 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
23780 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
23790 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Join = ++pParse-
237a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
237b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
237c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
237d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
237e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
237f0 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46  nt((v, "init LEF
23800 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
23810 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69  flag"));.  }..#i
23820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23830 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
23840 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70   if(  (pLevel->p
23850 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
23860 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
23870 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  )!=0 ){.    /* C
23880 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
23890 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
238a0 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
238b0 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
238c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
238d0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
238e0 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
238f0 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50  int iReg;   /* P
23900 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56  3 Value for OP_V
23910 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71  Filter */.    sq
23920 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
23930 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
23940 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
23950 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43  bIdx;.    int nC
23960 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61  onstraint = pVta
23970 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  bIdx->nConstrain
23980 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  t;.    struct sq
23990 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
239a0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
239b0 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
239f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
23a00 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72  e;.    const str
23a10 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
23a20 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43  x_constraint *aC
23a30 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20  onstraint =.    
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
23a70 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
23a80 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t;..    sqlite3E
23a90 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
23aa0 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  rse);.    iReg =
23ab0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23ac0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
23ad0 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
23ae0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f   for(j=1; j<=nCo
23af0 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
23b00 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
23b10 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
23b20 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
23b30 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
23b40 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
23b50 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
23b60 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69  aConstraint[k].i
23b70 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
23b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23b90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57  rCode(pParse, pW
23ba0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70  C->a[iTerm].pExp
23bb0 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b  r->pRight, iReg+
23bc0 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j+1);.          
23bd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23bf0 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e  f( k==nConstrain
23c00 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
23c10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23c20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23c30 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e  eger, pVtabIdx->
23c40 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
23c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23c60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23c70 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29  er, j-1, iReg+1)
23c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23c90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46  eAddOp4(v, OP_VF
23ca0 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64  ilter, iCur, add
23cb0 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61  rBrk, iReg, pVta
23cc0 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  bIdx->idxStr,.  
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
23cf0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
23d00 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34   P4_MPRINTF : P4
23d10 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56  _STATIC);.    pV
23d20 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
23d30 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
23d40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
23d50 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
23d60 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
23d70 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
23d80 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
23d90 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
23da0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
23db0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
23dc0 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b  pLevel, &pWC->a[
23dd0 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d  iTerm]);.      }
23de0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
23df0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
23e00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
23e10 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
23e20 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
23e30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23e40 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
23e50 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
23e60 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
23e70 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
23e80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23e90 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
23ea0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
23eb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23ec0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
23ed0 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ..  if( pLevel->
23ee0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
23ef0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
23f00 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
23f10 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
23f20 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
23f30 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
23f40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23f50 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
23f60 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
23f70 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f   ROWID field.  O
23f80 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
23f90 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d    we reference m
23fa0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69  ultiple rows usi
23fb0 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28  ng a "rowid IN (
23fc0 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20  ...)".    **    
23fd0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
23fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c  .    */.    iRel
23ff0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
24000 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24010 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  se);.    pTerm =
24020 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24030 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
24040 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
24050 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
24060 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
24070 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
24080 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61  Expr!=0 );.    a
24090 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65  ssert( pTerm->le
240a0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
240b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ;.    assert( om
240c0 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
240d0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
240e0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
240f0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
24100 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
24110 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52  2 */.    iRowidR
24120 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
24130 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
24140 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65  erm, pLevel, iRe
24150 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
24160 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
24170 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
24180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24190 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
241a0 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
241b0 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
241c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
241d0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
241e0 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
241f0 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
24200 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
24210 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
24220 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
24230 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24240 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
24250 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
24260 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
24270 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24280 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
24290 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
242a0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
242b0 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
242c0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
242d0 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
242e0 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
242f0 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
24300 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
24310 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
24320 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
24330 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
24340 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
24350 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
24360 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
24370 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
24380 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
24390 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
243a0 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
243b0 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
243c0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
243d0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
243e0 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_LE, 0);.    if
243f0 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
24400 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
24410 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
24420 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
24430 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
24440 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
24450 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24470 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
24480 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
24490 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
244a0 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
244b0 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
244c0 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
244d0 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
244e0 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
244f0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24500 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
24510 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
24520 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
24530 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
24540 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
24550 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
24560 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
24570 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
24580 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
24590 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
245a0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
245b0 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
245c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
245d0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
245e0 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
245f0 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
24600 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
24610 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
24620 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
24630 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
24640 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
24650 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
24660 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
24670 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
24680 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
24690 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
246a0 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
246b0 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
246c0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
246d0 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
246e0 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
246f0 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ct. */..      te
24700 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
24710 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
24720 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
24730 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
24740 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  /.      pX = pSt
24750 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
24760 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
24770 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24780 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
24790 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
247a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
247b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
247c0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
247d0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
247e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
247f0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
24800 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
24810 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
24820 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
24830 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
24840 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
24850 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
24860 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
24870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
24880 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
24890 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
248a0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
248b0 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
248c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
248d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
248e0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
248f0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
24900 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
24910 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24920 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
24930 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
24940 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
24950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24960 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
24970 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
24980 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
24990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
249a0 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
249b0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
249c0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
249d0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65  1662 */.      me
249e0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
249f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
24a00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24a10 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
24a20 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
24a30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
24a40 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
24a50 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
24a60 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
24a70 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
24a80 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
24a90 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
24aa0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
24ab0 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
24ac0 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
24ad0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
24ae0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
24af0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
24b00 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
24b10 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
24b20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
24b30 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
24b40 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
24b50 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
24b60 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69  2 = start;.    i
24b70 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20  f( pStart==0 && 
24b80 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pEnd==0 ){.     
24b90 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
24ba0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
24bb0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
24bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24bd0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
24be0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
24bf0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
24c00 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
24c10 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
24c20 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
24c30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24c40 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
24c50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24c60 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
24c70 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
24c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24c90 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
24ca0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
24cb0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
24cc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24cd0 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
24ce0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
24cf0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
24d00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24d10 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
24d20 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
24d30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24d40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
24d50 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
24d60 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
24d70 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
24d80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29  ERE_COLUMN_EQ) )
24d90 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
24da0 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e   A scan using an
24db0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
24dc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
24dd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d  e WHERE clause m
24de0 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20  ay contain zero 
24df0 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79  or more equality
24e00 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
24e10 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20   terms ("==" or 
24e20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20  "IN" operators) 
24e30 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
24e40 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  e N.    **      
24e50 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c     left-most col
24e60 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
24e70 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63  x. It may also c
24e80 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20  ontain.    **   
24e90 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79        inequality
24ea0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c   constraints (>,
24eb0 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e   <, >= or <=) on
24ec0 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20   the indexed.   
24ed0 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
24ee0 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  mn that immediat
24ef0 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  ely follows the 
24f00 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e  N equalities. On
24f10 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ly .    **      
24f20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73     the right-mos
24f30 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
24f40 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
24f50 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
24f60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
24f70 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
24f80 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f  N" operators. Fo
24f90 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
24fa0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  e .    **       
24fb0 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78    index is on (x
24fc0 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20  ,y,z), then the 
24fd0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65  following clause
24fe0 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a  s are all .    *
24ff0 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69  *         optimi
25000 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  zed:.    **.    
25010 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
25020 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  5.    **        
25030 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30      x=5 AND y=10
25040 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25050 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a     x=5 AND y<10.
25060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25070 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e    x=5 AND y>5 AN
25080 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
25090 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
250a0 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20   y=5 AND z<=10. 
250b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
250c0 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65       The z<10 te
250d0 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  rm of the follow
250e0 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ing cannot be us
250f0 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  ed, only.    ** 
25100 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20          the x=5 
25110 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  term:.    **.   
25120 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
25130 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20  =5 AND z<10.    
25140 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
25150 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20    N may be zero 
25160 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  if there are ine
25170 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25180 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20  nts..    **     
25190 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65      If there are
251a0 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63   no inequality c
251b0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e  onstraints, then
251c0 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20   N is at.    ** 
251d0 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e          least on
251e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
251f0 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61           This ca
25200 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  se is also used 
25210 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
25220 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20  o WHERE clause. 
25230 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
25240 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
25250 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
25260 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
25270 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  der.    **      
25280 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
25290 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
252a0 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
252b0 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20  DER BY..    */  
252c0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
252d0 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20  t u8 aStartOp[] 
252e0 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20  = {.      0,.   
252f0 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52     0,.      OP_R
25300 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20  ewind,          
25310 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63   /* 2: (!start_c
25320 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74  onstraints && st
25330 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29  artEq &&  !bRev)
25340 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73   */.      OP_Las
25350 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
25360 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 3: (!start_con
25370 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
25380 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a  tEq &&   bRev) *
25390 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
253a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
253b0 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  4: (start_constr
253c0 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74  aints  && !start
253d0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
253e0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c        OP_SeekLt,
253f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a             /* 5:
25400 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
25410 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
25420 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
25430 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20      OP_SeekGe,  
25440 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28           /* 6: (
25450 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
25460 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26  s  &&  startEq &
25470 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
25480 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20    OP_SeekLe     
25490 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74         /* 7: (st
254a0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
254b0 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
254c0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
254d0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
254e0 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20  t u8 aEndOp[] = 
254f0 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c  {.      OP_Noop,
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25510 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
25520 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ints) */.      O
25530 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
25540 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
25550 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
25560 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
25570 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20  _IdxLT          
25580 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
25590 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65  nstraints && bRe
255a0 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
255b0 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
255c0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a  l->plan.nEq;  /*
255d0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
255e0 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20   IN terms */.   
255f0 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
25600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
25610 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
25620 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
25630 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
25640 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25660 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
25670 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
25680 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
25690 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
256a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
256b0 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
256c0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
256d0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
256e0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
256f0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
25700 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
25710 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
25720 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
25730 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
25740 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
25750 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
25760 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
25770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25780 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
25790 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
257a0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
257b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
257c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
257d0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
257e0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
257f0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
25800 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
25810 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
25820 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
25830 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
25840 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
25850 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25860 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
25870 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
25880 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
25890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
258a0 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
258b0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
258c0 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
258d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
258e0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
258f0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
25900 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
25910 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
25920 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
25930 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
25940 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
25970 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
25980 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
25990 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
259a0 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
259b0 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
259c0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
259d0 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20  char *zEndAff;  
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259f0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
25a00 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
25a10 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64  aint */..    pId
25a20 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
25a30 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
25a40 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
25a50 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
25a60 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
25a70 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75  Eq];     /* Colu
25a80 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74  mn for inequalit
25a90 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
25aa0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
25ab0 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
25ac0 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
25ad0 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
25ae0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
25af0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
25b00 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
25b10 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
25b20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
25b30 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
25b40 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
25b50 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
25b60 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
25b70 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
25b80 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
25b90 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
25ba0 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
25bb0 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
25bc0 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
25bd0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
25be0 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
25bf0 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
25c00 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
25c10 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
25c20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
25c30 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
25c40 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
25c50 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
25c60 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
25c70 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
25c80 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
25c90 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
25ca0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
25cb0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
25cc0 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49  RBY).     && (pI
25cd0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
25ce0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
25cf0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
25d00 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
25d10 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
25d20 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
25d30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
25d40 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
25d50 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
25d60 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
25d70 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
25d80 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
25d90 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
25da0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25db0 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
25dc0 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
25dd0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
25de0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
25df0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
25e00 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
25e10 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
25e20 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
25e30 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
25e40 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
25e50 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
25e60 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
25e70 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
25e80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
25e90 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25ea0 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
25eb0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
25ec0 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
25ed0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
25ee0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
25ef0 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
25f00 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
25f10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
25f20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
25f30 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
25f40 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
25f50 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
25f60 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
25f70 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
25f80 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
25f90 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
25fa0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
25fb0 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
25fc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
25fd0 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
25fe0 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
25ff0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
26000 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
26010 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26  dy, nExtraReg, &
26020 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b  zStartAff.    );
26030 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73  .    zEndAff = s
26040 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
26050 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72  Parse->db, zStar
26060 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e  tAff);.    addrN
26070 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  xt = pLevel->add
26080 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  rNxt;..    /* If
26090 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
260a0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
260b0 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
260c0 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
260d0 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72   ** a forward or
260e0 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65  der scan on a de
260f0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
26100 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20  interchange the 
26110 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e  .    ** start an
26120 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61  d end terms (pRa
26130 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61  ngeStart and pRa
26140 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a  ngeEnd)..    */.
26150 20 20 20 20 69 66 28 20 6e 45 71 3c 70 49 64 78      if( nEq<pIdx
26160 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65  ->nColumn && bRe
26170 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
26180 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
26190 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20  E_SO_ASC) ){.   
261a0 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
261b0 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
261c0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
261d0 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
261e0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
261f0 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
26200 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
26210 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
26220 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
26230 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
26240 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
26250 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26260 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
26270 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
26280 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
26290 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
262a0 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
262b0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
262c0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61  WO_GE );.    sta
262d0 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
262e0 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
262f0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
26300 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
26310 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
26320 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
26330 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
26340 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
26350 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
26360 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
26370 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
26380 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
26390 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
263a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
263b0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
263c0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
263d0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
263e0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
263f0 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
26400 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
26410 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
26420 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
26430 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
26440 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
26450 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53      if( (pRangeS
26460 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
26470 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
26480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26490 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
264a0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
264b0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
264c0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
264d0 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
264e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
264f0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
26500 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
26510 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d  zStartAff[nEq])=
26520 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
26530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
26540 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
26550 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
26560 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
26570 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
26580 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
26590 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
265a0 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
265b0 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
265c0 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
265d0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
265e0 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
265f0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
26600 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
26610 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
26620 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
26630 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
26640 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
26650 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
26660 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
26670 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
26680 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
26690 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
266a0 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
266b0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
266c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
266d0 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
266e0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
266f0 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
26700 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
26710 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
26720 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
26730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26740 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
26750 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
26760 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
26770 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
26780 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
26790 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
267a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
267b0 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
267c0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
267d0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
267e0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
267f0 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
26800 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
26810 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
26820 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
26830 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
26840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
26850 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
26860 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26870 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
26880 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26890 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
268a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
268b0 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
268c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
268d0 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
268e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
268f0 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
26900 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
26910 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
26920 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
26930 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
26940 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
26950 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
26960 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
26970 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
26980 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
26990 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
269a0 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
269b0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
269c0 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
269d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
269e0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
269f0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
26a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26a10 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
26a20 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
26a30 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
26a40 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
26a50 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
26a60 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
26a70 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
26a80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26a90 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
26aa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26ab0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
26ac0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
26ad0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
26ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26af0 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20  f( zEndAff ){.  
26b00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26b10 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
26b20 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
26b30 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
26b40 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
26b50 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
26b60 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
26b70 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
26b80 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
26b90 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
26ba0 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
26bb0 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
26bc0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
26bd0 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
26be0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
26bf0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
26c00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  */.          zEn
26c10 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
26c20 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
26c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26c40 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
26c50 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
26c60 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  nge(pRight, zEnd
26c70 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
26c80 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e         zEndAff[n
26c90 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
26ca0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
26cb0 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
26cc0 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
26cd0 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
26ce0 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41  se, nEq+1, zEndA
26cf0 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  ff);.      nCons
26d00 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
26d10 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
26d20 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
26d30 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
26d40 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
26d50 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  662 */.    }.   
26d60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
26d70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72  Parse->db, zStar
26d80 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  tAff);.    sqlit
26d90 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
26da0 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a  >db, zEndAff);..
26db0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
26dc0 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
26dd0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
26de0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
26df0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
26e00 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
26e10 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
26e20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
26e30 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
26e40 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70    op = aEndOp[(p
26e50 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29  RangeEnd || nEq)
26e60 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a   * (1 + bRev)];.
26e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
26e80 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
26e90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
26ea0 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74  P_IdxGE );.    t
26eb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26ec0 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28  IdxLT );.    if(
26ed0 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a   op!=OP_Noop ){.
26ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26ef0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
26f00 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
26f10 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
26f20 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
26f30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26f40 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62  geP5(v, endEq!=b
26f50 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d  Rev ?1:0);.    }
26f60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
26f70 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
26f80 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68   constraints, ch
26f90 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
26fa0 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ue.    ** of the
26fb0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68   table column th
26fc0 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  at the inequalit
26fd0 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e  y contrains is n
26fe0 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  ot NULL..    ** 
26ff0 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74  If it is, jump t
27000 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
27010 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
27020 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20  ..    */.    r1 
27030 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27040 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27050 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
27060 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
27070 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
27080 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
27090 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
270a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
270b0 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  TOP_LIMIT );.   
270c0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
270d0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
270e0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
270f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
27100 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27110 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
27120 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
27130 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
27140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27150 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
27160 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e  ull, r1, addrCon
27170 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
27180 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
27190 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
271a0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68  ..    /* Seek th
271b0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
271c0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
271d0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
271e0 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61  Level, pRangeSta
271f0 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65  rt);.    disable
27200 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
27210 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  ngeEnd);.    if(
27220 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
27230 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
27240 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
27250 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
27260 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
27270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27280 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
27290 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69  , iIdxCur, iRowi
272a0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
272b0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
272c0 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
272d0 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
272e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
272f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
27300 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  eek, iCur, iRowi
27310 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72  dReg);  /* Defer
27320 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20  red seek */.    
27330 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64  }..    /* Record
27340 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
27350 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61   used to termina
27360 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73  te the loop. Dis
27370 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45  able .    ** WHE
27380 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
27390 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62  made redundant b
273a0 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67  y the index rang
273b0 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e scan..    */. 
273c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
273d0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
273e0 45 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  ERE_UNIQUE ){.  
273f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
27400 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
27410 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
27420 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
27430 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
27440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
27450 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78  vel->op = OP_Nex
27460 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  t;.    }.    pLe
27470 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
27480 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  r;.  }else..#ifn
27490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
274a0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
274b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
274c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
274d0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
274e0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
274f0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
27500 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
27510 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
27520 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
27530 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
27540 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
27550 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
27560 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
27570 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
27580 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
27590 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
275a0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
275b0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
275c0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
275d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
275e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
275f0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
27600 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
27610 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
27620 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
27630 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
27640 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
27650 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
27660 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
27670 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
27680 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
27690 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
276a0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
276c0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
276d0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
276e0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
276f0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
27700 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
27710 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
27720 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
27730 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
27740 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
27750 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
27760 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
27770 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
27780 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
27790 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
277a0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
277b0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
277c0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
277d0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
277e0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
277f0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
27800 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
27810 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
27820 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
27830 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
27840 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
27850 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
27860 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
27870 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
27880 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
27890 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
278a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
278b0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
278c0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
278d0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
278e0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
278f0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
27900 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
27910 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
27920 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
27930 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
27940 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
27950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
27960 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
27970 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
27980 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
27990 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
279a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
279b0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
279c0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
279d0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
279e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
279f0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
27a00 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
27a10 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
27a20 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
27a30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
27a40 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
27a50 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
27a60 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
27a70 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
27a80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
27a90 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
27aa0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
27ab0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
27ac0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
27ad0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
27ae0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
27af0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c  erms */.    SrcL
27b00 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
27b10 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
27b20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
27b30 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
27b40 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72  on */..    int r
27b50 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
27b60 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20  rse->nMem;      
27b70 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
27b80 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f   used with OP_Go
27b90 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  sub */.    int r
27ba0 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20  egRowset = 0;   
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
27bd0 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65   for RowSet obje
27be0 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ct */.    int re
27bf0 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  gRowid = 0;     
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
27c20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f  holding rowid */
27c30 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f  .    int iLoopBo
27c40 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
27c50 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
27c60 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20  * Start of loop 
27c70 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  body */.    int 
27c80 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20  iRetInit;       
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ca0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
27cb0 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e   of regReturn in
27cc0 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e  it */.    int un
27cd0 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b  testedTerms = 0;
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27cf0 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63  Some terms not c
27d00 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64  ompletely tested
27d10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27d40 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
27d50 20 20 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72    Expr *pAndExpr
27d60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27d70 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41       /* An ".. A
27d80 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  ND (...)" expres
27d90 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20  sion */.   .    
27da0 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e  pTerm = pLevel->
27db0 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20  plan.u.pTerm;.  
27dc0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
27dd0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
27de0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27df0 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20  or==WO_OR );.   
27e00 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
27e10 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
27e20 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20  ORINFO)!=0 );.  
27e30 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d    pOrWc = &pTerm
27e40 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
27e50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
27e60 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
27e70 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
27e80 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
27e90 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
27ea0 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20  cList ni pOrTab 
27eb0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
27ec0 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
27ed0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
27ee0 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
27ef0 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
27f00 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
27f10 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
27f20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
27f30 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
27f40 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
27f50 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
27f60 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
27f70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
27f80 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
27f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
27fa0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
27fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
27fc0 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
27fd0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
27fe0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27ff0 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
28000 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
28010 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
28020 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
28030 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
28040 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
28050 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
28060 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
28070 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Raw(pParse->db,.
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
280a0 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
280b0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
280c0 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
280d0 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
280e0 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
280f0 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
28100 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36  b->nAlloc = (i16
28110 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
28120 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
28130 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
28140 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
28150 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
28160 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
28170 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
28180 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
28190 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
281a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
281b0 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
281c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
281d0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
281e0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
281f0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
28200 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
28210 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
28220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
28230 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
28240 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
28250 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
28260 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
28270 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
28280 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
28290 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
282a0 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
282b0 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
282c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
282d0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
282e0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
282f0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
28300 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
28310 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
28320 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
28330 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
28340 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
28350 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
28360 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
28370 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
28380 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
28390 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
283a0 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
283b0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
283c0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
283d0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
283e0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
283f0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
28400 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
28410 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
28420 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
28430 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
28440 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
28450 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
28460 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
28470 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
28480 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
28490 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
284a0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
284b0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
284c0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
284d0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
284e0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
284f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
28500 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
28510 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
28520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28530 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
28540 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
28550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
28560 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
28570 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
28580 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
28590 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  turn);..    /* I
285a0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  f the original W
285b0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 7a  HERE clause is z
285c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 28   of the form:  (
285d0 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
285e0 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54 68   AND y.    ** Th
285f0 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  en for every ter
28600 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20 61  m xN, evaluate a
28610 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  s the subexpress
28620 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20 20  ion: xN AND z.  
28630 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 74    ** That way, t
28640 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20 61  erms in y that a
28650 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74 6f  re factored into
28660 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f 6e   the disjunction
28670 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
28680 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68 65  picked up by the
28690 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
286a0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
286b0 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a 20  Begin() below.. 
286c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
286d0 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a 20 20  C->nTerm>1 ){.  
286e0 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73      pAndExpr = s
286f0 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
28700 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 41  pParse->db, TK_A
28710 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ND, 0, 0);.     
28720 20 70 41 6e 64 45 78 70 72 2d 3e 70 52 69 67 68   pAndExpr->pRigh
28730 74 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  t = pWhere;.    
28740 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
28750 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
28760 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
28770 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
28780 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
28790 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
287a0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
287b0 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72  ==iCur || pOrTer
287c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
287d0 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _AND ){.        
287e0 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
287f0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
28800 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
28810 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
28820 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
28830 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
28840 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
28850 20 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29    if( pAndExpr )
28860 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64  {.          pAnd
28870 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f  Expr->pLeft = pO
28880 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  rExpr;.         
28890 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45   pOrExpr = pAndE
288a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
288b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
288c0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
288d0 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
288e0 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
288f0 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e  .        pSubWIn
28900 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
28910 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
28920 4f 72 54 61 62 2c 20 70 4f 72 45 78 70 72 2c 20  OrTab, pOrExpr, 
28930 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
28950 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c  ERE_OMIT_OPEN_CL
28960 4f 53 45 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f  OSE | WHERE_AND_
28970 4f 4e 4c 59 20 7c 0a 20 20 20 20 20 20 20 20 20  ONLY |.         
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
28990 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
289a0 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
289b0 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20  E_ONLY);.       
289c0 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
289d0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  {.          expl
289e0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
289f0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
28a00 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
28a10 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
28a20 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
28a30 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
28a40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28a50 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28a60 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
28a70 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
28a80 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
28a90 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
28aa0 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
28ab0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
28ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d  .            r =
28ad0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28ae0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
28af0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
28b00 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20  , -1, iCur, .   
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b        regRowid);
28b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
28b60 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
28b70 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20  st, regRowset,. 
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
28bb0 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20  ntAddr(v)+2, r, 
28bc0 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
28bd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
28be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28bf0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
28c00 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
28c10 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
28c20 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
28c30 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
28c40 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
28c50 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
28c60 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
28c70 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
28c80 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
28c90 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
28ca0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
28cb0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
28cc0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
28cd0 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
28ce0 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
28cf0 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
28d00 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
28d10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
28d20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
28d30 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
28d40 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
28d50 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
28d60 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
28d70 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
28d80 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
28d90 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
28da0 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
28db0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
28dc0 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
28dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28de0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
28df0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
28e00 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b  ->db, pAndExpr);
28e10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28e20 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
28e30 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
28e40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
28e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28e60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
28e70 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
28e80 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
28e90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28ea0 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
28eb0 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
28ec0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
28ed0 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
28ee0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
28ef0 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
28f00 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
28f10 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
28f20 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
28f30 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
28f40 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
28f50 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
28f60 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
28f70 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
28f80 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
28f90 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
28fa0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
28fb0 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
28fc0 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
28fd0 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
28fe0 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
28ff0 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
29000 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
29010 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
29020 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
29030 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
29040 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
29050 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
29060 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
29070 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
29080 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
29090 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c  ep[bRev];.    pL
290a0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
290b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
290c0 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
290d0 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
290e0 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
290f0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
29100 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
29110 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
29120 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20  SCAN_STEP;.  }. 
29130 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
29140 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
29150 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f  Set, iCur);..  /
29160 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
29170 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
29180 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
29190 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
291a0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
291b0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
291c0 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
291d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
291e0 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34  ENTATION-OF: R-4
291f0 39 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73  9525-50935 Terms
29200 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
29210 73 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67  satisfied throug
29220 68 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  h.  ** the use o
29230 66 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65  f indices become
29240 20 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20   tests that are 
29250 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73  evaluated agains
29260 74 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20  t each row of.  
29270 2a 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  ** the relevant 
29280 69 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20  input tables..  
29290 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
292a0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
292b0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
292c0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
292d0 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63  r *pE;.    testc
292e0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
292f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
29300 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  AL ); /* IMP: R-
29310 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
29320 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
29330 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
29340 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
29350 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
29360 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
29370 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
29380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
29390 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
293a0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
293b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
293c0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
293d0 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
293f0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
29400 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
29410 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
29420 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
29430 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
29440 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
29450 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
29460 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
29470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
29480 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
29490 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
294a0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
294b0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
294c0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
294d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
294e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
294f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
29500 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
29510 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
29520 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
29530 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
29540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
29550 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
29560 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
29570 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
29580 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
29590 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
295a0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
295b0 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
295c0 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
295d0 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
295e0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
295f0 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
29600 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
29610 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
29620 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
29630 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
29640 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
29650 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
29660 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
29670 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
29680 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
29690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
296a0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
296b0 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
296c0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
296d0 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
296e0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
296f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
29700 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
29710 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20  ERM_VIRTUAL );  
29720 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d  /* IMP: R-30575-
29730 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 74  11662 */.      t
29740 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
29750 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
29760 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66  ODED );.      if
29770 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
29780 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
29790 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
297a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
297b0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
297c0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
297d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
297e0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75  ssert( pWInfo->u
297f0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a  ntestedTerms );.
29800 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
29810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29820 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
29830 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71  Expr );.      sq
29840 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29850 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
29860 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c  pExpr, addrCont,
29870 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
29880 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
29890 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
298a0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
298b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
298c0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
298d0 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
298e0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  ..  return notRe
298f0 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ady;.}..#if defi
29900 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
29910 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
29920 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
29930 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
29940 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
29950 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
29960 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
29970 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
29980 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
29990 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
299a0 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
299b0 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
299c0 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
299d0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
299e0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
299f0 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
29a00 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
29a10 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
29a20 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
29a30 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
29a40 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
29a50 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
29a60 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
29a70 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
29a80 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
29a90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
29aa0 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  T */.../*.** Fre
29ab0 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
29ac0 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
29ad0 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
29ae0 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Free(sqlite3 *db
29af0 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  , WhereInfo *pWI
29b00 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  nfo){.  if( ALWA
29b10 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  YS(pWInfo) ){.  
29b20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
29b30 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
29b40 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
29b50 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
29b60 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
29b70 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
29b80 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
29b90 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
29ba0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e    /* assert( pIn
29bb0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
29bc0 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  xStr==0 || db->m
29bd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a  allocFailed ); *
29be0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
29bf0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
29c00 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  dxStr ){.       
29c10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29c20 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  pInfo->idxStr);.
29c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
29c50 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
29c60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57    }.      if( pW
29c70 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e  Info->a[i].plan.
29c80 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29c90 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20  TEMP_INDEX ){.  
29ca0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
29cb0 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  x = pWInfo->a[i]
29cc0 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  .plan.u.pIdx;.  
29cd0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29        if( pIdx )
29ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
29cf0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
29d00 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  dx->zColAff);.  
29d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
29d20 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 29 3b  bFree(db, pIdx);
29d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29d40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65   }.    }.    whe
29d50 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57  reClauseClear(pW
29d60 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20  Info->pWC);.    
29d70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
29d80 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  , pWInfo);.  }.}
29d90 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
29da0 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
29db0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
29dc0 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
29dd0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
29de0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
29df0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
29e00 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
29e10 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
29e20 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
29e30 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
29e40 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
29e50 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
29e60 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
29e70 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
29e80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
29e90 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
29ea0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
29eb0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
29ec0 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
29ed0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
29ee0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
29ef0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
29f00 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
29f10 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
29f20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
29f30 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
29f40 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
29f50 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
29f60 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
29f70 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
29f80 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
29f90 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
29fa0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
29fb0 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
29fc0 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
29fd0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
29fe0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
29ff0 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
2a000 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
2a010 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2a020 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2a030 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
2a040 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
2a050 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
2a060 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
2a070 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
2a080 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a090 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2a0a0 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
2a0b0 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2a0c0 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
2a0d0 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
2a0e0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
2a0f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2a100 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
2a110 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
2a120 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
2a130 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
2a140 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
2a170 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
2a180 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2a190 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
2a1a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2a1b0 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
2a1e0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
2a1f0 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
2a200 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
2a210 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
2a220 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
2a230 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
2a240 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
2a250 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
2a260 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
2a270 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
2a280 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
2a290 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
2a2a0 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
2a2b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a2c0 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
2a2d0 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
2a2e0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
2a2f0 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
2a300 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
2a310 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
2a320 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
2a330 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
2a340 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
2a350 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a360 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
2a370 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
2a380 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
2a390 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
2a3a0 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
2a3b0 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
2a3c0 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
2a3d0 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
2a3e0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
2a3f0 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
2a400 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
2a410 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
2a420 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
2a430 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
2a440 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
2a450 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
2a460 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
2a470 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
2a480 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
2a490 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
2a4a0 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
2a4b0 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
2a4c0 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
2a4d0 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
2a4e0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
2a4f0 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
2a500 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
2a510 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
2a520 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
2a530 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
2a540 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
2a550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
2a560 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
2a570 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
2a580 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
2a590 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
2a5a0 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
2a5b0 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
2a5c0 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
2a5d0 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
2a5e0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
2a5f0 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
2a600 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
2a610 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
2a620 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
2a630 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
2a640 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
2a650 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
2a660 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
2a670 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
2a680 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
2a690 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
2a6a0 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
2a6b0 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
2a6c0 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
2a6d0 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
2a6e0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
2a6f0 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
2a700 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
2a710 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
2a720 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
2a730 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
2a740 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
2a750 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
2a760 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
2a770 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
2a780 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
2a790 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
2a7a0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2a7b0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
2a7c0 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
2a7d0 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
2a7e0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
2a7f0 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
2a800 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
2a810 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
2a820 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
2a830 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
2a840 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
2a850 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
2a860 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
2a870 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
2a880 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
2a890 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
2a8a0 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
2a8b0 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
2a8c0 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
2a8d0 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
2a8e0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
2a8f0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
2a900 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
2a910 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
2a920 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
2a930 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
2a940 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
2a950 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
2a960 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
2a970 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
2a980 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
2a990 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
2a9a0 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
2a9b0 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
2a9c0 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
2a9d0 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
2a9e0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
2a9f0 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
2aa00 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  **.** *ppOrderBy
2aa10 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
2aa20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2aa30 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
2aa40 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
2aa50 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
2aa60 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2aa70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2aa80 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
2aa90 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
2aaa0 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
2aab0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2aac0 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72  nt, then ppOrder
2aad0 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
2aae0 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
2aaf0 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
2ab00 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
2ab10 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
2ab20 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
2ab30 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
2ab40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2ab50 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
2ab60 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
2ab70 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
2ab80 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54   set to NULL.  T
2ab90 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
2aba0 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
2abb0 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63  ents an.** unnec
2abc0 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74  essary sort of t
2abd0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66  he result set if
2abe0 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
2abf0 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a  riate for the.**
2ac00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2ac10 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
2ac20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68  .**.** If the wh
2ac30 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73  ere clause loops
2ac40 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e   cannot be arran
2ac50 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  ged to provide t
2ac60 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75  he correct.** ou
2ac70 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  tput order, then
2ac80 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20   the *ppOrderBy 
2ac90 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
2aca0 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
2acb0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
2acc0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2acd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2ace0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2acf0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2ad00 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
2ad10 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
2ad20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
2ad30 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
2ad40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ad50 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2ad60 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f    ExprList **ppO
2ad70 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52  rderBy, /* An OR
2ad80 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
2ad90 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  r NULL */.  Expr
2ada0 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
2adb0 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d    /* The select-
2adc0 6c 69 73 74 20 66 6f 72 20 44 49 53 54 49 4e 43  list for DISTINC
2add0 54 20 71 75 65 72 69 65 73 20 2d 20 6f 72 20 4e  T queries - or N
2ade0 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
2adf0 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 2f  rlFlags        /
2ae00 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
2ae10 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
2ae20 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
2ae30 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ae60 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  nter */.  int nB
2ae70 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
2ae80 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
2ae90 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
2aea0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
2aeb0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
2aec0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
2aed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2aee0 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
2aef0 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
2af00 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
2af10 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
2af20 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
2af30 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
2af40 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
2af50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2af60 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
2af70 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
2af80 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
2af90 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
2afa0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
2afb0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
2afc0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
2afd0 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
2afe0 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
2aff0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
2b000 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
2b010 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
2b020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2b030 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
2b040 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b050 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2b060 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
2b070 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
2b080 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
2b090 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
2b0a0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
2b0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
2b0c0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
2b0d0 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
2b0e0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2b110 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
2b120 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
2b130 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
2b140 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
2b150 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2b160 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
2b170 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  Flags */.  sqlit
2b180 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2b190 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2b1a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
2b1b0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
2b1c0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2b1d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2b1e0 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
2b1f0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
2b200 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
2b210 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
2b220 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
2b230 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
2b240 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
2b250 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
2b260 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b270 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
2b280 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
2b290 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
2b2a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
2b2b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
2b2c0 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
2b2d0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
2b2e0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
2b2f0 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
2b300 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
2b310 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
2b320 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
2b330 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
2b340 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
2b350 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
2b360 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
2b370 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
2b380 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
2b390 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2b3a0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
2b3b0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
2b3c0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2b3d0 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
2b3e0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b3f0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
2b400 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
2b410 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
2b420 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2b430 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
2b440 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2b450 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
2b460 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
2b470 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
2b480 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
2b490 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
2b4a0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
2b4b0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
2b4c0 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
2b4d0 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
2b4e0 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
2b4f0 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
2b500 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
2b510 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
2b520 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
2b530 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
2b540 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
2b550 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
2b560 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
2b570 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
2b580 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
2b590 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
2b5a0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
2b5b0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
2b5c0 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
2b5d0 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
2b5e0 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
2b5f0 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
2b600 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
2b610 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
2b620 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2b630 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
2b640 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
2b650 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
2b660 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
2b670 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
2b680 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
2b690 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2b6a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2b6b0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2b6c0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
2b6d0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2b6e0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
2b6f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
2b700 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
2b710 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
2b720 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
2b730 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
2b740 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
2b750 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
2b760 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2b770 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
2b780 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
2b790 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
2b7a0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
2b7b0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
2b7c0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
2b7d0 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
2b7e0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
2b7f0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2b800 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
2b810 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
2b820 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 44  &pWC[1];..  /* D
2b830 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
2b840 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
2b850 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
2b860 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
2b870 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
2b880 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
2b890 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2b8a0 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
2b8b0 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
2b8c0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2b8d0 4f 70 74 20 29 20 70 44 69 73 74 69 6e 63 74 20  Opt ) pDistinct 
2b8e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  = 0;..  /* Split
2b8f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b900 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
2b910 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
2b920 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
2b930 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
2b940 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
2b950 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
2b960 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
2b970 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
2b980 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57  ereClauseInit(pW
2b990 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C, pParse, pMask
2b9a0 53 65 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 29  Set, wctrlFlags)
2b9b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2b9c0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61  odeConstants(pPa
2b9d0 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  rse, pWhere);.  
2b9e0 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
2b9f0 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
2ba00 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38     /* IMP: R-158
2ba10 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20  42-53296 */.    
2ba20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
2ba30 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
2ba40 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
2ba50 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
2ba60 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
2ba70 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
2ba80 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
2ba90 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
2baa0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
2bab0 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
2bac0 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
2bad0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2bae0 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
2baf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2bb00 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2bb10 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
2bb20 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
2bb30 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2bb40 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
2bb50 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
2bb60 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
2bb70 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
2bb80 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2bb90 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
2bba0 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
2bbb0 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
2bbc0 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
2bbd0 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
2bbe0 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
2bbf0 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
2bc00 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
2bc10 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
2bc20 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
2bc30 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
2bc40 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
2bc50 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
2bc60 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
2bc70 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
2bc80 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
2bc90 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
2bca0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
2bcb0 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
2bcc0 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
2bcd0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
2bce0 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
2bcf0 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
2bd00 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
2bd10 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
2bd20 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
2bd30 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
2bd40 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
2bd50 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
2bd60 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
2bd70 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
2bd80 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
2bd90 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
2bda0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2bdb0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
2bdc0 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
2bdd0 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
2bde0 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
2bdf0 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
2be00 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73  WhereClause.vmas
2be10 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  k variable so th
2be20 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72  at bits that cor
2be30 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20  respond.  ** to 
2be40 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
2be50 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54  rsors are set. T
2be60 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
2be70 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62  electively disab
2be80 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d  le .  ** the OR-
2be90 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61  to-IN transforma
2bea0 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c  tion in exprAnal
2beb0 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20  yzeOrTerm(). It 
2bec0 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a  is not helpful .
2bed0 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61    ** with virtua
2bee0 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
2bef0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
2bf00 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
2bf10 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
2bf20 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
2bf30 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
2bf40 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
2bf50 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
2bf60 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
2bf70 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
2bf80 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
2bf90 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
2bfa0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
2bfb0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
2bfc0 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
2bfd0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
2bfe0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
2bff0 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20  ( pWC->vmask==0 
2c000 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d  && pMaskSet->n==
2c010 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
2c020 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2c030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
2c040 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
2c050 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2c060 69 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65  iCursor);.#ifnde
2c070 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2c080 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2c090 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69  f( ALWAYS(pTabLi
2c0a0 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26  st->a[i].pTab) &
2c0b0 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
2c0c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
2c0d0 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76   ){.      pWC->v
2c0e0 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  mask |= ((Bitmas
2c0f0 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d  k)1 << i);.    }
2c100 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e  .#endif.  }.#ifn
2c110 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
2c120 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
2c130 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
2c140 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
2c150 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2c160 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
2c170 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2c180 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
2c190 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2c1a0 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
2c1b0 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
2c1c0 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
2c1d0 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
2c1e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
2c1f0 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
2c200 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
2c210 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
2c220 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
2c230 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
2c240 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
2c250 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2c260 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
2c270 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
2c280 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
2c290 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
2c2a0 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
2c2b0 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
2c2c0 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
2c2d0 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
2c2e0 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
2c2f0 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
2c300 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  cessed..  */.  e
2c310 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
2c320 61 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20  abList, pWC);.  
2c330 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2c340 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2c350 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2c360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
2c370 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  k if the DISTINC
2c380 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66 20  T qualifier, if 
2c390 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 73  there is one, is
2c3a0 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20 2a   redundant. .  *
2c3b0 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2c3c0 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20 74   set pDistinct t
2c3d0 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72 65  o NULL and Where
2c3e0 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20 74  Info.eDistinct t
2c3f0 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49 53  o.  ** WHERE_DIS
2c400 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f 20  TINCT_UNIQUE to 
2c410 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  tell the caller 
2c420 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44 49  to ignore the DI
2c430 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20 69  STINCT..  */.  i
2c440 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26 20  f( pDistinct && 
2c450 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
2c460 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ant(pParse, pTab
2c470 4c 69 73 74 2c 20 70 57 43 2c 20 70 44 69 73 74  List, pWC, pDist
2c480 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69  inct) ){.    pDi
2c490 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
2c4a0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
2c4b0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
2c4c0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a  CT_UNIQUE;.  }..
2c4d0 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
2c4e0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
2c4f0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
2c500 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2c510 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
2c520 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
2c530 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2c540 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
2c550 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
2c560 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
2c570 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
2c580 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
2c590 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
2c5a0 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73  nfo->a[].wsFlags
2c5b0 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
2c5c0 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
2c5d0 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
2c5e0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
2c5f0 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
2c600 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
2c610 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
2c620 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
2c630 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d  m     Which term
2c640 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2c650 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64  use is being cod
2c660 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ed.  **   pWInfo
2c670 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20  ->a[].iTabCur   
2c680 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
2c690 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2c6a0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57   table.  **   pW
2c6b0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75  Info->a[].iIdxCu
2c6c0 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
2c6d0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
2c6e0 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
2c6f0 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57  >a[].pTerm     W
2c700 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f  hen wsFlags==WO_
2c710 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73  OR, the OR-claus
2c720 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a  e term.  **.  **
2c730 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
2c740 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
2c750 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
2c760 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2c770 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
2c780 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
2c790 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2c7a0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
2c7b0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
2c7c0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2c7d0 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
2c7e0 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
2c7f0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2c800 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b   i<nTabList; i++
2c810 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2c820 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50   WhereCost bestP
2c830 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lan;         /* 
2c840 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70  Most efficient p
2c850 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20  lan seen so far 
2c860 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
2c870 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2c880 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
2c890 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
2c8a0 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
2c8b0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2c8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2c8d0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52   looping over FR
2c8e0 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  OM tables */.   
2c8f0 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b   int bestJ = -1;
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c910 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
2c920 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c940 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
2c950 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
2c960 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f  J */.    int isO
2c970 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20  ptimal;         
2c980 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2c990 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e   for optimal/non
2c9a0 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20  -optimal search 
2c9b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f  */.    int nUnco
2c9c0 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20  nstrained;      
2c9d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62     /* Number tab
2c9e0 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45  les without INDE
2c9f0 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69  XED BY */.    Bi
2ca00 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64  tmask notIndexed
2ca10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
2ca20 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  k of tables that
2ca30 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69   cannot use an i
2ca40 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  ndex */..    mem
2ca50 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30  set(&bestPlan, 0
2ca60 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61  , sizeof(bestPla
2ca70 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61  n));.    bestPla
2ca80 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  n.rCost = SQLITE
2ca90 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48  _BIG_DBL;.    WH
2caa0 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42  ERETRACE(("*** B
2cab0 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20  egin search for 
2cac0 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20  loop %d ***\n", 
2cad0 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  i));..    /* Loo
2cae0 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65  p through the re
2caf0 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20  maining entries 
2cb00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2cb10 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20  se to find the. 
2cb20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65     ** next neste
2cb30 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70  d loop. The loop
2cb40 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20   tests all FROM 
2cb50 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20  clause entries. 
2cb60 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63     ** either onc
2cb70 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20  e or twice. .   
2cb80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
2cb90 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77  irst test is alw
2cba0 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ays performed if
2cbb0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
2cbc0 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20  r more entries. 
2cbd0 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20     ** remaining 
2cbe0 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72  and never perfor
2cbf0 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20  med if there is 
2cc00 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c  only one FROM cl
2cc10 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a  ause entry.    *
2cc20 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d  * to choose from
2cc30 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73  .  The first tes
2cc40 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22  t looks for an "
2cc50 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20  optimal" scan.  
2cc60 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  In.    ** this c
2cc70 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61  ontext an optima
2cc80 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68  l scan is one th
2cc90 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  at uses the same
2cca0 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a   strategy.    **
2ccb0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46   for the given F
2ccc0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
2ccd0 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c   as would be sel
2cce0 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74  ected if the ent
2ccf0 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75  ry.    ** were u
2cd00 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72  sed as the inner
2cd10 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  most nested loop
2cd20 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2cd30 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a  s, a table.    *
2cd40 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68  * is chosen such
2cd50 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f   that the cost o
2cd60 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74  f running that t
2cd70 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  able cannot be r
2cd80 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  educed.    ** by
2cd90 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68   waiting for oth
2cda0 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e  er tables to run
2cdb0 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f   first.  This "o
2cdc0 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72  ptimal" test wor
2cdd0 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72  ks.    ** by fir
2cde0 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  st assuming that
2cdf0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2ce00 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72   is on the inner
2ce10 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e   loop and findin
2ce20 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65  g.    ** its que
2ce30 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68  ry plan, then ch
2ce40 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
2ce50 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e   that query plan
2ce60 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a   uses any.    **
2ce70 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
2ce80 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  se terms that ar
2ce90 65 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66 20  e notReady.  If 
2cea0 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72 6d  no notReady term
2ceb0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73 65  s are.    ** use
2cec0 64 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69  d then the "opti
2ced0 6d 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20  mal" query plan 
2cee0 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  works..    **.  
2cef0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2cf00 68 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f  he WhereCost.nRo
2cf10 77 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  w parameter for 
2cf20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20  an optimal scan 
2cf30 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74  might.    ** not
2cf40 20 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20   be as small as 
2cf50 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74  it would be if t
2cf60 68 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20  he table really 
2cf70 77 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f  were the innermo
2cf80 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20  st.    ** join. 
2cf90 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
2cfa0 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 20 62  can be reduced b
2cfb0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  y WHERE clause c
2cfc0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
2cfd0 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73  * that do not us
2cfe0 65 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20  e indices.  But 
2cff0 74 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74  this nRow reduct
2d000 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ion only happens
2d010 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
2d020 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
2d030 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69  he innermost joi
2d040 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  n.  .    **.    
2d050 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ** The second lo
2d060 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  op iteration is 
2d070 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69  only performed i
2d080 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61  f no optimal sca
2d090 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67  n.    ** strateg
2d0a0 69 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62  ies were found b
2d0b0 79 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  y the first iter
2d0c0 61 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f  ation. This seco
2d0d0 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20  nd iteration.   
2d0e0 20 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73   ** is used to s
2d0f0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f  earch for the lo
2d100 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f  west cost scan o
2d110 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20  verall..    **. 
2d120 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76     ** Previous v
2d130 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2d140 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79  e performed only
2d150 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
2d160 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74  ation -.    ** t
2d170 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73  he next outermos
2d180 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79  t loop was alway
2d190 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  s that with the 
2d1a0 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20  lowest overall. 
2d1b0 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65     ** cost. Howe
2d1c0 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20  ver, this meant 
2d1d0 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c  that SQLite coul
2d1e0 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f  d select the wro
2d1f0 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66  ng plan.    ** f
2d200 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20  or scripts such 
2d210 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
2d220 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20  :.    **   .    
2d230 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2d240 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20  E t1(a, b); .   
2d250 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
2d260 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20  LE t2(c, d);.   
2d270 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
2d280 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45  ROM t2, t1 WHERE
2d290 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61   t2.rowid = t1.a
2d2a0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
2d2b0 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67  The best strateg
2d2c0 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20  y is to iterate 
2d2d0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
2d2e0 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20   first. However 
2d2f0 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
2d300 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
2d310 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68  ermine this with
2d320 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
2d330 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
2d340 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 73  ** Since the cos
2d350 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63  t of a linear sc
2d360 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  an through table
2d370 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20   t2 is the same 
2d380 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63  .    ** as the c
2d390 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20  ost of a linear 
2d3a0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62  scan through tab
2d3b0 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20  le t1, a simple 
2d3c0 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61  greedy .    ** a
2d3d0 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f  lgorithm may cho
2d3e0 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f  ose to use t2 fo
2d3f0 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  r the outer loop
2d400 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63  , which is a muc
2d410 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65  h.    ** costlie
2d420 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20  r approach..    
2d430 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72  */.    nUnconstr
2d440 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e  ained = 0;.    n
2d450 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 20  otIndexed = 0;. 
2d460 20 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c     for(isOptimal
2d470 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74  =(iFrom<nTabList
2d480 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d  -1); isOptimal>=
2d490 30 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73  0 && bestJ<0; is
2d4a0 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20  Optimal--){.    
2d4b0 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 20    Bitmask mask; 
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2d4d0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e 6f  ask of tables no
2d4e0 74 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a 20  t yet ready */. 
2d4f0 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d       for(j=iFrom
2d500 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
2d510 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54  List->a[j]; j<nT
2d520 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54 61  abList; j++, pTa
2d530 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  bItem++){.      
2d540 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64    int doNotReord
2d550 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  er;    /* True i
2d560 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f  f this table sho
2d570 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64  uld not be reord
2d580 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
2d590 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b  WhereCost sCost;
2d5a0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66       /* Cost inf
2d5b0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65  ormation from be
2d5c0 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78  st[Virtual]Index
2d5d0 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  () */.        Ex
2d5e0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2d5f0 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63  ;  /* ORDER BY c
2d600 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20  lause for index 
2d610 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20  to optimize */. 
2d620 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
2d630 2a 70 44 69 73 74 3b 20 20 20 20 20 2f 2a 20 44  *pDist;     /* D
2d640 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 66  ISTINCT clause f
2d650 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69  or index to opti
2d660 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20  mize */.  .     
2d670 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
2d680 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
2d690 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
2d6a0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
2d6b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d  .        if( j!=
2d6c0 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65  iFrom && doNotRe
2d6d0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
2d6e0 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61         m = getMa
2d6f0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2d700 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2d710 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 20  .        if( (m 
2d720 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
2d730 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d740 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
2d750 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
2d760 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2d770 7d 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d  }.        mask =
2d780 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d 20   (isOptimal ? m 
2d790 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  : notReady);.   
2d7a0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
2d7b0 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65  ((i==0 && ppOrde
2d7c0 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42 79  rBy )?*ppOrderBy
2d7d0 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44 69  :0);.        pDi
2d7e0 73 74 20 3d 20 28 69 3d 3d 30 20 3f 20 70 44 69  st = (i==0 ? pDi
2d7f0 73 74 69 6e 63 74 20 3a 20 30 29 3b 0a 20 20 20  stinct : 0);.   
2d800 20 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65       if( pTabIte
2d810 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e  m->pIndex==0 ) n
2d820 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b  Unconstrained++;
2d830 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45 52  .  .        WHER
2d840 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79  ETRACE(("=== try
2d850 69 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69 74  ing table %d wit
2d860 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d  h isOptimal=%d =
2d870 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ==\n",.         
2d880 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69 73             j, is
2d890 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20  Optimal));.     
2d8a0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
2d8b0 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66  tem->pTab );.#if
2d8c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d8d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2d8e0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
2d8f0 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
2d900 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2d910 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
2d920 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e  nfo **pp = &pWIn
2d930 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66  fo->a[j].pIdxInf
2d940 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  o;.          bes
2d950 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
2d960 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
2d970 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65  tem, mask, notRe
2d980 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  ady, pOrderBy,. 
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9a0 20 20 20 20 20 20 20 20 20 20 26 73 43 6f 73 74            &sCost
2d9b0 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , pp);.        }
2d9c0 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
2d9d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2d9e0 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
2d9f0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61  pParse, pWC, pTa
2da00 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74  bItem, mask, not
2da10 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c  Ready, pOrderBy,
2da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2da30 44 69 73 74 2c 20 26 73 43 6f 73 74 29 3b 0a 20  Dist, &sCost);. 
2da40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da50 20 61 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d   assert( isOptim
2da60 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65  al || (sCost.use
2da70 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  d&notReady)==0 )
2da80 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
2da90 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2daa0 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
2dab0 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61 6e 20  , then the plan 
2dac0 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a 20 20  must use that.  
2dad0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69        ** index i
2dae0 66 20 69 74 20 75 73 65 73 20 61 6e 79 20 69 6e  f it uses any in
2daf0 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20  dex at all */.  
2db00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2db10 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d  abItem->pIndex==
2db20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
2db30 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70       || (sCost.p
2db40 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2db50 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2db60 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2db70 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e         || sCost.
2db80 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61  plan.u.pIdx==pTa
2db90 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b  bItem->pIndex );
2dba0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ..        if( is
2dbb0 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43 6f 73  Optimal && (sCos
2dbc0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2dbd0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2dbe0 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
2dbf0 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20       notIndexed 
2dc00 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  |= m;.        }.
2dc10 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
2dc20 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69  itions under whi
2dc30 63 68 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  ch this table be
2dc40 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20 73  comes the best s
2dc50 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a  o far:.        *
2dc60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
2dc70 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  1) The table mus
2dc80 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  t not depend on 
2dc90 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 68 61  other tables tha
2dca0 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20  t have not.     
2dcb0 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20     **       yet 
2dcc0 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  run..        **.
2dcd0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32 29          **   (2)
2dce0 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63   A full-table-sc
2dcf0 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73  an plan cannot s
2dd00 75 70 65 72 63 65 64 65 20 69 6e 64 65 78 65 64  upercede indexed
2dd10 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20   plan unless.   
2dd20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68       **       th
2dd30 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61  e full-table-sca
2dd40 6e 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61 6c  n is an "optimal
2dd50 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e 65  " plan as define
2dd60 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
2dd70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2dd80 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73 20   (3) All tables 
2dd90 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44 20  have an INDEXED 
2dda0 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69  BY clause or thi
2ddb0 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e  s table lacks an
2ddc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2ddd0 20 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61    INDEXED BY cla
2dde0 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c  use or this tabl
2ddf0 65 20 75 73 65 73 20 74 68 65 20 73 70 65 63 69  e uses the speci
2de00 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  fic.        **  
2de10 20 20 20 20 20 69 6e 64 65 78 20 73 70 65 63 69       index speci
2de20 66 69 65 64 20 62 79 20 69 74 73 20 49 4e 44 45  fied by its INDE
2de30 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20  XED BY clause.  
2de40 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72 65  This rule ensure
2de50 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  s.        **    
2de60 20 20 20 74 68 61 74 20 61 20 62 65 73 74 2d 73     that a best-s
2de70 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73 20  o-far is always 
2de80 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  selected even if
2de90 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20   an impossible. 
2dea0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2deb0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49  combination of I
2dec0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2ded0 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54 68  s are given.  Th
2dee0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
2def0 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65  **       will be
2df00 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65   detected and re
2df10 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74 68  layed back to th
2df20 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61  e application la
2df30 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ter..        ** 
2df40 20 20 20 20 20 20 54 68 65 20 4e 45 56 45 52 28        The NEVER(
2df50 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62 65  ) comes about be
2df60 63 61 75 73 65 20 72 75 6c 65 20 28 32 29 20 61  cause rule (2) a
2df70 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20 20  bove prevents.  
2df80 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41        **       A
2df90 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c  n indexable full
2dfa0 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d  -table-scan from
2dfb0 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20 28   reaching rule (
2dfc0 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  3)..        **. 
2dfd0 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29 20         **   (4) 
2dfe0 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75  The plan cost mu
2dff0 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61 6e  st be lower than
2e000 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72 20   prior plans or 
2e010 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20 20  else the.       
2e020 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20 6d   **       cost m
2e030 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
2e040 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
2e050 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20 6c  f rows must be l
2e060 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ower..        */
2e070 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73 43  .        if( (sC
2e080 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64  ost.used&notRead
2e090 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  y)==0           
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2e0b0 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
2e0c0 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c    && (bestJ<0 ||
2e0d0 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29 21   (notIndexed&m)!
2e0e0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2e0f0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
2e100 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62             || (b
2e110 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2e120 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2e130 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20  _FULLSCAN)==0.  
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2e150 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46   (sCost.plan.wsF
2e160 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2e170 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20  _FULLSCAN)!=0). 
2e180 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
2e190 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30  Unconstrained==0
2e1a0 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70 49   || pTabItem->pI
2e1b0 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33 29  ndex==0   /* (3)
2e1c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e1d0 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73 43      || NEVER((sC
2e1e0 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
2e1f0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
2e200 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20  LSCAN)!=0)).    
2e210 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74          && (best
2e220 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f  J<0 || sCost.rCo
2e230 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  st<bestPlan.rCos
2e240 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  t      /* (4) */
2e250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e260 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73 74   || (sCost.rCost
2e270 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  <=bestPlan.rCost
2e280 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2e290 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61 6e     && sCost.plan
2e2a0 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70  .nRow<bestPlan.p
2e2b0 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20  lan.nRow)).     
2e2c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e2d0 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d  WHERETRACE(("===
2e2e0 20 74 61 62 6c 65 20 25 64 20 69 73 20 62 65 73   table %d is bes
2e2f0 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20 20  t so far".      
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e310 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61  " with cost=%g a
2e320 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20  nd nRow=%g\n",. 
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e340 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72 43       j, sCost.rC
2e350 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e  ost, sCost.plan.
2e360 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20  nRow));.        
2e370 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f    bestPlan = sCo
2e380 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  st;.          be
2e390 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  stJ = j;.       
2e3a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   }.        if( d
2e3b0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
2e3c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2e3d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62   }.    assert( b
2e3e0 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61  estJ>=0 );.    a
2e3f0 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20  ssert( notReady 
2e400 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  & getMask(pMaskS
2e410 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2e420 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20  bestJ].iCursor) 
2e430 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
2e440 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
2e450 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20  r selects table 
2e460 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22 0a  %d for loop %d".
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61  " with cost=%g a
2e490 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20  nd nRow=%g\n",. 
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e4b0 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57 49  estJ, pLevel-pWI
2e4c0 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e  nfo->a, bestPlan
2e4d0 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e  .rCost, bestPlan
2e4e0 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20  .plan.nRow));.  
2e4f0 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
2e500 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2e510 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30  HERE_ORDERBY)!=0
2e520 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64   ){.      *ppOrd
2e530 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  erBy = 0;.    }.
2e540 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2e550 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2e560 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29   WHERE_DISTINCT)
2e570 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
2e580 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  ert( pWInfo->eDi
2e590 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20  stinct==0 );.   
2e5a0 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
2e5b0 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
2e5c0 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20  TINCT_ORDERED;. 
2e5d0 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
2e5e0 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  s &= bestPlan.pl
2e5f0 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
2e600 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62  pLevel->plan = b
2e610 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20  estPlan.plan;.  
2e620 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
2e630 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2e640 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2e650 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  D );.    testcas
2e660 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  e( bestPlan.plan
2e670 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2e680 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20  _TEMP_INDEX );. 
2e690 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
2e6a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
2e6b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
2e6c0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20  ERE_TEMP_INDEX) 
2e6d0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
2e6e0 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
2e6f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
2e700 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
2e710 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31  el->iIdxCur = -1
2e720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
2e730 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
2e740 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
2e750 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43  ist->a[bestJ].iC
2e760 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76  ursor);.    pLev
2e770 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29  el->iFrom = (u8)
2e780 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20 62  bestJ;.    if( b
2e790 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
2e7a0 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a  w>=(double)1 ){.
2e7b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
2e7c0 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74  ueryLoop *= best
2e7d0 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  Plan.plan.nRow;.
2e7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
2e7f0 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20  eck that if the 
2e800 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79  table scanned by
2e810 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61   this loop itera
2e820 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20  tion had an.    
2e830 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
2e840 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
2e850 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61   it, that the na
2e860 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69  med index is bei
2e870 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66  ng.    ** used f
2e880 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20  or the scan. If 
2e890 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20  not, then query 
2e8a0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20  compilation has 
2e8b0 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52  failed..    ** R
2e8c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
2e8d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20      */.    pIdx 
2e8e0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  = pTabList->a[be
2e8f0 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20  stJ].pIndex;.   
2e900 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2e910 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2e920 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e930 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
2e940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2e950 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2e960 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65  rse, "cannot use
2e970 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64   index: %s", pId
2e980 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
2e990 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2e9a0 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  inError;.      }
2e9b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2e9c0 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
2e9d0 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64  Y clause is used
2e9e0 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  , the bestIndex(
2e9f0 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
2ea00 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
2ea10 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  eed to find the 
2ea20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20  index specified 
2ea30 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  in the INDEXED B
2ea40 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  Y clause.       
2ea50 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61   ** if it find a
2ea60 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20  n index at all. 
2ea70 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2ea80 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t( bestPlan.plan
2ea90 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b  .u.pIdx==pIdx );
2eaa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2eab0 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
2eac0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
2ead0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
2eae0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2eaf0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2eb00 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2eb10 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2eb20 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
2eb30 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
2eb40 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
2eb50 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
2eb60 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
2eb70 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
2eb80 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
2eb90 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
2eba0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
2ebb0 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
2ebc0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
2ebd0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
2ebe0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2ebf0 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
2ec00 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
2ec10 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
2ec20 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
2ec30 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
2ec40 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
2ec50 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
2ec60 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
2ec70 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
2ec80 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
2ec90 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2eca0 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
2ecb0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
2ecc0 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
2ecd0 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
2ece0 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
2ecf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2ed00 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2ed10 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
2ed20 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
2ed30 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2ed40 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2ed50 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c  ED)!=0 && (andFl
2ed60 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
2ed70 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  UE)!=0 ){.    pW
2ed80 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
2ed90 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
2eda0 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[0].plan.wsFla
2edb0 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
2edc0 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
2edd0 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
2ede0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
2edf0 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
2ee00 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
2ee10 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
2ee20 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
2ee30 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
2ee40 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
2ee50 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
2ee60 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
2ee70 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e  fier Goto */.  n
2ee80 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
2ee90 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d  ask)0;.  pWInfo-
2eea0 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62  >nRowOut = (doub
2eeb0 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  le)1;.  for(i=0,
2eec0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
2eed0 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  a; i<nTabList; i
2eee0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2eef0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
2ef00 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
2ef10 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2ef20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
2ef30 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
2ef40 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
2ef50 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20  le/index */..   
2ef60 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
2ef70 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2ef80 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
2ef90 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2efa0 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
2efb0 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74  iTabCur = pTabIt
2efc0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2efd0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
2efe0 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   *= pLevel->plan
2eff0 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d  .nRow;.    iDb =
2f000 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2f010 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
2f020 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66  pSchema);.    if
2f030 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2f040 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2f050 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
2f060 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
2f070 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
2f080 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
2f090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2f0a0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2f0b0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2f0c0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2f0d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
2f0e0 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
2f0f0 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
2f100 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
2f110 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
2f120 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
2f130 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
2f140 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2f150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f160 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
2f170 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
2f180 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
2f190 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2f1a0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2f1b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2f1c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2f1d0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
2f1e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f1f0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f  RE_OMIT_OPEN_CLO
2f200 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  SE)==0 ){.      
2f210 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  int op = pWInfo-
2f220 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  >okOnePass ? OP_
2f230 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f  OpenWrite : OP_O
2f240 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73  penRead;.      s
2f250 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
2f260 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
2f270 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
2f280 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
2f290 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
2f2a0 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
2f2b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f2c0 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20  pTab->nCol==BMS 
2f2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57  );.      if( !pW
2f2e0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
2f2f0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d  && pTab->nCol<BM
2f300 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  S ){.        Bit
2f310 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
2f320 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
2f330 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
2f340 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
2f350 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
2f360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f370 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71  beChangeP4(v, sq
2f380 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2f390 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20  Addr(v)-1, .    
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
2f3c0 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34  NT_TO_PTR(n), P4
2f3d0 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
2f3e0 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
2f3f0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
2f400 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2f410 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2f420 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2f430 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2f440 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2f450 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2f460 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
2f470 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
2f480 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2f490 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
2f4a0 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  MP_INDEX)!=0 ){.
2f4b0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41        constructA
2f4c0 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
2f4d0 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
2f4e0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  tem, notReady, p
2f4f0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  Level);.    }els
2f500 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2f510 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2f520 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2f530 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
2f540 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d      Index *pIx =
2f550 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
2f560 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49  pIdx;.      KeyI
2f570 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
2f580 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
2f590 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20  pParse, pIx);.  
2f5a0 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20      int iIdxCur 
2f5b0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2f5c0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2f5d0 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
2f5e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
2f5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49        assert( iI
2f600 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20  dxCur>=0 );.    
2f610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f620 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
2f630 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78  ad, iIdxCur, pIx
2f640 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2f670 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
2f680 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62  DOFF);.      Vdb
2f690 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2f6a0 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
2f6b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f6c0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2f6d0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
2f6e0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
2f6f0 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70   ~getMask(pWC->p
2f700 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
2f710 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  m->iCursor);.  }
2f720 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20  .  pWInfo->iTop 
2f730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2f740 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
2f750 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2f760 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65  led ) goto where
2f770 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f  BeginError;..  /
2f780 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
2f790 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
2f7a0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
2f7b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
2f7c0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
2f7d0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
2f7e0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
2f7f0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
2f800 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
2f810 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
2f820 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2f830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61    for(i=0; i<nTa
2f840 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  bList; i++){.   
2f850 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2f860 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 65 78 70  o->a[i];.    exp
2f870 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72  lainOneScan(pPar
2f880 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2f890 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76 65 6c 2d  evel, i, pLevel-
2f8a0 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
2f8b0 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  gs);.    notRead
2f8c0 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53  y = codeOneLoopS
2f8d0 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20  tart(pWInfo, i, 
2f8e0 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52  wctrlFlags, notR
2f8f0 65 61 64 79 2c 20 70 57 68 65 72 65 29 3b 0a 20  eady, pWhere);. 
2f900 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2f910 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2f920 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69  ddrCont;.  }..#i
2f930 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2f940 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67    /* For testing
2f950 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
2f960 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20  se only */.  /* 
2f970 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75  Record in the qu
2f980 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61  ery plan informa
2f990 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
2f9a0 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a  urrent table.  *
2f9b0 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
2f9c0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69  used to access i
2f9d0 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20  t (if any).  If 
2f9e0 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
2f9f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
2fa00 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a  d, its name is j
2fa10 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f  ust '{}'.  If no
2fa20 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20   index is used. 
2fa30 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
2fa40 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e   listed as "{}".
2fa50 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79    If the primary
2fa60 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65   key is used the
2fa70 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65  .  ** index name
2fa80 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20   is '*'..  */.  
2fa90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c  for(i=0; i<nTabL
2faa0 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ist; i++){.    c
2fab0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
2fac0 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
2fad0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
2fae0 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2faf0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2fb00 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
2fb10 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
2fb20 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
2fb30 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
2fb40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
2fb50 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
2fb60 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
2fb70 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
2fb80 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
2fb90 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
2fba0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2fbb0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2fbc0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
2fbd0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2fbe0 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
2fbf0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
2fc00 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
2fc10 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
2fc20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fc30 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
2fc40 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2fc50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
2fc60 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
2fc70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fc80 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2fc90 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
2fca0 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
2fcb0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
2fcc0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2fcd0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b  HERE_ROWID_EQ );
2fce0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2fcf0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2fd00 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
2fd10 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69  D_RANGE );.    i
2fd20 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
2fd30 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2fd40 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
2fd50 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
2fd60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
2fd70 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2fd80 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
2fd90 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
2fda0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
2fdb0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2fdc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2fdd0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2fde0 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  {.      n = sqli
2fdf0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76  te3Strlen30(pLev
2fe00 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
2fe10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
2fe20 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
2fe30 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
2fe40 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
2fe50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
2fe60 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2fe70 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
2fe80 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
2fe90 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
2fea0 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
2feb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71         sqlite3_q
2fec0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
2fed0 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
2fee0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2fef0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
2ff00 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2ff10 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33  QPlan], "{} ", 3
2ff20 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
2ff30 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 3;.    }.  }.
2ff40 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
2ff50 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
2ff60 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
2ff70 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
2ff80 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2ff90 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
2ffa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
2ffb0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
2ffc0 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
2ffd0 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
2ffe0 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
2fff0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
30000 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
30010 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
30020 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
30030 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
30040 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
30050 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
30060 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
30070 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
30080 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
30090 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
300a0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
300b0 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
300c0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
300d0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
300e0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
300f0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
30100 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
30110 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
30120 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
30130 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
30140 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30150 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
30160 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
30170 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
30180 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
30190 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
301a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
301b0 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
301c0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
301d0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
301e0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
301f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
30200 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
30210 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
30220 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
30230 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
30240 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
30250 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
30260 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
30270 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
30280 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
30290 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
302a0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
302b0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
302c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
302d0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
302e0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
302f0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  ->a[i];.    sqli
30300 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30310 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
30320 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
30330 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
30340 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
30350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30360 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
30370 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
30380 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73  el->p2);.      s
30390 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
303a0 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
303b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
303c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
303d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
303e0 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
303f0 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
30400 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
30410 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
30420 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
30430 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30440 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
30450 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
30460 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
30470 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
30480 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
30490 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
304a0 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
304b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
304c0 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
304d0 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
304e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
304f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
30500 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
30510 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
30520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30530 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
30540 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
30550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
30560 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
30570 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
30580 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
30590 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
305a0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
305b0 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
305c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
305d0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
305e0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
305f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
30600 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
30610 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
30620 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
30630 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d  assert( (pLevel-
30640 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
30650 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
30660 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
30670 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
30680 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
30690 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
306a0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
306b0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
306c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
306d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
306e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
306f0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
30700 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
30710 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
30720 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
30730 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a  ->iIdxCur>=0 ){.
30740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30750 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30760 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
30770 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
30780 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
30790 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
307a0 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
307b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
307c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
307d0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
307e0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
307f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30810 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
30820 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
30830 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
30840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30850 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
30860 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
30870 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
30880 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
30890 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
308a0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
308b0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
308c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
308d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
308e0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
308f0 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
30900 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
30910 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
30920 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
30930 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
30940 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
30950 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49  nLevel==1 || pWI
30960 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61  nfo->nLevel==pTa
30970 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
30980 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
30990 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
309a0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
309b0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
309c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
309d0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
309e0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
309f0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
30a00 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
30a10 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
30a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
30a30 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
30a40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
30a50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
30a60 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
30a70 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
30a80 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
30a90 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
30aa0 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29  OMIT_OPEN_CLOSE)
30ab0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
30ac0 20 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c   int ws = pLevel
30ad0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
30ae0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
30af0 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
30b00 28 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  (ws & WHERE_IDX_
30b10 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
30b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30b30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
30b40 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
30b50 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
30b60 20 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57       if( (ws & W
30b70 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
30b80 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f   && (ws & WHERE_
30b90 54 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29  TEMP_INDEX)==0 )
30ba0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30bb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30bc0 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d  P_Close, pLevel-
30bd0 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
30be0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
30bf0 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
30c00 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
30c10 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  e code substitut
30c20 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
30c30 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
30c40 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65  e index in prefe
30c50 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62  rence to the tab
30c60 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74  le. Sometimes, t
30c70 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
30c80 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20   the table need 
30c90 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72  never be read fr
30ca0 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65  om. This is a pe
30cb0 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c  rformance boost,
30cc0 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76  .    ** as the v
30cd0 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20  dbe level waits 
30ce0 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20  until the table 
30cf0 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61  is read before a
30d00 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73  ctually.    ** s
30d10 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eeking the table
30d20 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72   cursor to the r
30d30 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64  ecord correspond
30d40 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
30d50 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  nt.    ** positi
30d60 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  on in the index.
30d70 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
30d80 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
30d90 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
30da0 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
30db0 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
30dc0 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
30dd0 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
30de0 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
30df0 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
30e00 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
30e10 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
30e20 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
30e30 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
30e40 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
30e50 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
30e60 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
30e70 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
30e80 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
30e90 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
30ea0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
30eb0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
30ec0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
30ed0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
30ee0 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  0 && !db->malloc
30ef0 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69  Failed){.      i
30f00 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20  nt k, j, last;. 
30f10 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
30f20 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
30f30 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
30f40 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20  an.u.pIdx;..    
30f50 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
30f60 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
30f70 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
30f80 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
30f90 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
30fa0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30fb0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
30fc0 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
30fd0 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
30fe0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
30ff0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
31000 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
31010 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31020 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
31030 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
31040 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
31050 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
31060 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
31070 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
31080 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
31090 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
310a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
310b0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
310c0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
310d0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
310e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
310f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
31100 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
31120 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
31130 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
31140 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
31150 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49           || j<pI
31160 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
31170 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
31180 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
31190 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
311a0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
311b0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
311c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
311d0 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
311e0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
311f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
31200 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
31210 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73  nup.  */.  pPars
31220 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
31230 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
31240 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65  eryLoop;.  where
31250 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
31260 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  nfo);.  return;.
31270 7d 0a                                            }.