/ Hex Artifact Content
Login

Artifact bc46a3e6e3cf158360e2b2a0e7c9ee73124de581:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65  ral index */.#de
2c40: 66 69 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49  fine WHERE_DISTI
2c50: 4e 43 54 20 20 20 20 20 30 78 34 30 30 30 30 30  NCT     0x400000
2c60: 30 30 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f  00  /* Correct o
2c70: 72 64 65 72 20 66 6f 72 20 44 49 53 54 49 4e 43  rder for DISTINC
2c80: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  T */../*.** Init
2c90: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
2ca0: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
2cb0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2cd0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
2ce0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d00: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
2d10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2d20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d40: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2d50: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2d60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
2d70: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
2d90: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
2da0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
2db0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2dc0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
2dd0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
2de0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
2df0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
2e00: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
2e10: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2e20: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
2e30: 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a  pWC->vmask = 0;.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2e70: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2e80: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2e90: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2ea0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2eb0: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2ec0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2ed0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2ee0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2ef0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2f00: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2f10: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2f20: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2f30: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2f40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2f50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2f60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2f70: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2f80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f90: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2fa0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2fb0: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2fc0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2fd0: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ff0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3000: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
3010: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
3020: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
3030: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
3040: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
3050: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
3060: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
3070: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
3080: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
30a0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
30b0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
30c0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
30d0: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
30e0: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
30f0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
3100: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
3110: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
3120: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
3130: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3140: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3160: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
3170: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
3180: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3190: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
31a0: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
31b0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
31c0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
31d0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
31e0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
31f0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
3200: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
3210: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
3220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3230: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
3240: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
3250: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3260: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
3270: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
3280: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
3290: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
32a0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
32b0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
32c0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
32d0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
32e0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
32f0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3300: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3310: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3320: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3330: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
3340: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
3350: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
3360: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
3370: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
3380: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
3390: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
33a0: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
33b0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
33c0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
33d0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
33e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
33f0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3400: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3410: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3430: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
3440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
3450: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3460: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
3470: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
3480: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
3490: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
34a0: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
34b0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
34c0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
34d0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
34e0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
34f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3500: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3510: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3520: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3530: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
3540: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3550: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
3560: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
3570: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
3580: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
3590: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
35a0: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
35b0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
35c0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
35d0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
35e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
35f0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3600: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3610: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3620: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3630: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
3640: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
3650: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
3660: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
3670: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
3680: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3690: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
36a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
36b0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
36c0: 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52  UAL );  /* EV: R
36d0: 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a  -00211-15100 */.
36e0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
36f0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3700: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3710: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3720: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3730: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3740: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3750: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3760: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3770: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3780: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3790: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
37a0: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
37b0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
37c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
37e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3800: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3810: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3820: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3830: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3840: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3850: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3860: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3880: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3890: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
38a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38b0: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
38c0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
38d0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
38e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
38f0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3900: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3910: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3920: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3930: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3940: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3950: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3960: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3980: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3990: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
39a0: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
39b0: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
39c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
39d0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
39e0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
39f0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3a00: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3a10: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3a20: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3a30: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3a40: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3a50: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3a60: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3a70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3a80: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3a90: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3aa0: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3ab0: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
3ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
3ad0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3ae0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3af0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3b00: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3b10: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3b20: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3b40: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3b50: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3b60: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3b70: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3b90: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3ba0: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3bb0: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
3bc0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
3bd0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
3be0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3bf0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3c00: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3c10: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3c20: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3c30: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3c40: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3c50: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3c60: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3c70: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3c80: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3c90: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3ca0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3cc0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3cd0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ce0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3cf0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3d00: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3d10: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3d20: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3d40: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3d50: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3d60: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3d70: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3d80: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3d90: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3da0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3db0: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3dc0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3dd0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3de0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3df0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3e00: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3e10: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3e20: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3e30: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3e40: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3e50: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3e60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3e70: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3e80: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3e90: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3ea0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3eb0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ec0: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
3ed0: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
3ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
3ef0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
3f00: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
3f10: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
3f20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3f30: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
3f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3f50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3f60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
3f70: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
3f80: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
3f90: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
3fa0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
3fb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
3fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3fd0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3fe0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
3ff0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
4000: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
4010: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4020: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
4030: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
4040: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
4050: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
4060: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
4070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
4080: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
4090: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
40a0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
40b0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
40c0: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
40d0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
40e0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
40f0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
4100: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
4110: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4120: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
4130: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
4140: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
4150: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
4160: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
4170: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
4180: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
4190: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
41a0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
41b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
41c0: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
41d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
41e0: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
41f0: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
4200: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
4210: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
4220: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
4230: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
4240: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
4250: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
4260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
4270: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52  .** The sqlite3R
4280: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4290: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
42a0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
42b0: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
42c0: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
42d0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
42e0: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
42f0: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
4300: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
4310: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
4320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
4330: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
4340: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
4350: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
4360: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
4370: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
4380: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
4390: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
43a0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
43b0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
43c0: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
43d0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
43e0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
43f0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4400: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
4410: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4420: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
4430: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4440: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
4450: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
4460: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
4470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4480: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4490: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
44a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
44b0: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
44c0: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
44d0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
44e0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44f0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
4500: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
4510: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4520: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
4530: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4540: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4550: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
4560: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
4570: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4580: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
4590: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
45a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
45b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
45c0: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
45d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
45e0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
45f0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4600: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4610: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4620: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4630: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
4640: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4650: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
4660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4680: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
4690: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46a0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
46b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
46d0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
46e0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
46f0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
4700: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4710: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
4720: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4730: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
4740: 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  S ){.    mask |=
4750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4760: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4770: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
4780: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4790: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
47a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
47b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
47c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
47d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
47e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
47f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4800: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4810: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
4820: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4830: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4840: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
4850: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4860: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4870: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4880: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4890: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
48a0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
48b0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
48c0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
48d0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
48e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
48f0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4900: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4910: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4920: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4930: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4940: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4950: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4960: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4970: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4980: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
49a0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
49b0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
49c0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
49d0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
49e0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
49f0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4a00: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4a10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4a20: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a30: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4a40: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4a50: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4a60: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a70: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4a80: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4a90: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4aa0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4ab0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4ad0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4ae0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4af0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4b00: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b10: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4b20: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4b30: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4b40: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4b50: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b60: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4b70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4b80: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4b90: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ba0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4bb0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4bc0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4bd0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4be0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4bf0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4c00: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4c10: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4c20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4c30: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4c40: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4c50: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4c60: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4c70: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4c80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4c90: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4ca0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4cb0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4cc0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4cd0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
4ce0: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
4cf0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
4d00: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
4d10: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
4d20: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
4d30: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
4d40: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
4d50: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
4d60: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
4d70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4d80: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
4d90: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
4da0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
4db0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
4dc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
4dd0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
4de0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
4df0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
4e00: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
4e10: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
4e20: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
4e30: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
4e40: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4e50: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4e60: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
4e70: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
4e80: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
4e90: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
4ea0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
4eb0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
4ec0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
4ed0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
4ee0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
4ef0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
4f00: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
4f10: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
4f20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4f30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4f40: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
4f50: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
4f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4f70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
4f90: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
4fa0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
4fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
4fc0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
4fd0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
4fe0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4ff0: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5000: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5010: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5020: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5030: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5040: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5050: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5060: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5070: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
5080: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
5090: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
50a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
50b0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
50c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
50d0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
50e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
50f0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5100: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5110: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5120: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5130: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5140: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5150: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5160: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5170: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
5180: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
5190: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
51a0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
51b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
51c0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
51d0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
51e0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
51f0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5200: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5210: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5220: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5230: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5240: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5250: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5260: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5270: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
5280: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
5290: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
52a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
52b0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
52c0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
52d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
52e0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
52f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5300: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5310: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5320: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5330: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5340: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5350: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5360: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5370: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
5380: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5390: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
53a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
53c0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
53d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
53e0: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
53f0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5400: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5410: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5420: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5430: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5440: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5450: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5460: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5470: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
5480: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
5490: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
54a0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
54b0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
54c0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
54d0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
54e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
54f0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5500: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5510: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5520: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5530: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5540: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5550: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5570: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
5580: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
5590: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
55a0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
55b0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
55c0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55e0: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
55f0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5600: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5610: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5620: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5630: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5640: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5650: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5660: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5670: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
5680: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
5690: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
56a0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
56b0: 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
56c0: 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
56d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
56e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
56f0: 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  ur.       && (pT
5700: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5710: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
5720: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
5730: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
5740: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26  Column.       &&
5750: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
5760: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
5770: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
5780: 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  x && pTerm->eOpe
5790: 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c  rator!=WO_ISNULL
57a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
57b0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
57c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  xpr;.        Col
57d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
57e0: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
57f0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
5800: 0a 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a  .        Parse *
5810: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
5820: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  arse;..        i
5830: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
5840: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
5850: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
5860: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
5870: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
5880: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
5890: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
58a0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
58b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
58c0: 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64  equence required
58d0: 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66   from an index f
58e0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  or.        ** it
58f0: 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f   to be useful fo
5900: 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70  r optimising exp
5910: 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72  ression pX. Stor
5920: 65 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  e this.        *
5930: 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61  * value in varia
5940: 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20  ble pColl..     
5950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
5960: 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b  sert(pX->pLeft);
5970: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
5980: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
5990: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
59a0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
59b0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
59c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c       assert(pCol
59d0: 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  l || pParse->nEr
59e0: 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  r);..        for
59f0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
5a00: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
5a10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5a20: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
5a30: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
5a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5a50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5a60: 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  pColl && sqlite3
5a70: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
5a80: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
5a90: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
5aa0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5ab0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
5ac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5ad0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
5ae0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5af0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5b00: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
5b10: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
5b20: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
5b30: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
5b40: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
5b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
5b60: 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  **.**.*/.static 
5b70: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5b80: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
5b90: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5ba0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5bb0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5bc0: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5bd0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5be0: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5bf0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5c10: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5c20: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5c30: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
5c40: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
5c50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5c60: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
5c70: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
5c80: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
5c90: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5ca0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5cb0: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5cc0: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5cd0: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5ce0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5cf0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5d00: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5d10: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5d20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5d30: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
5d40: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
5d50: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
5d60: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
5d70: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
5d80: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
5d90: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5db0: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5dd0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5de0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5df0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5e00: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5e10: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5e20: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5e30: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
5e40: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
5e50: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
5e60: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
5e70: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
5e80: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
5e90: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5ea0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5eb0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5ec0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5ed0: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5ee0: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5ef0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5f00: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5f20: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5f30: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
5f40: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5f50: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
5f60: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
5f70: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
5f80: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
5f90: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5fa0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5fc0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5fd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5fe0: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6000: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
6010: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
6020: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
6030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6040: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
6050: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
6060: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
6070: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
6080: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
6090: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
60a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
60b0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
60c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
60d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
60e0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
60f0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
6100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
6110: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
6120: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
6130: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
6140: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
6150: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
6160: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
6170: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
6180: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
6190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
61a0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
61b0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
61c0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
61d0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
61e0: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
61f0: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
6200: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
6210: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
6220: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
6230: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
6240: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
6250: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
6260: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
6270: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
6280: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
6290: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
62a0: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
62b0: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
62c0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
62d0: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
62e0: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
62f0: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
6300: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a  as AFF_TEXT */..
6310: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
6320: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6330: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
6340: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
6350: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
6360: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
6370: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
6380: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
6390: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
63a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
63b0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
63c0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
63d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
63e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
63f0: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
6400: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
6410: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
6420: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
6430: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
6440: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
6450: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
6460: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
6480: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6490: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
64a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
64b0: 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  Col); /* IMP: R-
64c0: 32 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20  23257-02778 */. 
64d0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
64e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
64f0: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
6500: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
6510: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
6520: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
6530: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
6540: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
6550: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
6560: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
6570: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
6580: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
6590: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
65a0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
65b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
65c0: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
65d0: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
65e0: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
65f0: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
6600: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
6610: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
6620: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
6630: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
6640: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
6650: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
6660: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
6670: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
6680: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
6690: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
66a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
66b0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
66c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
66d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
66e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
66f0: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
6700: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f 2a 20 49  ->iColumn); /* I
6710: 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37  MP: R-23257-0277
6720: 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  8 */.        if(
6730: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
6740: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
6750: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
6760: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
6770: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
6780: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
6790: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
67a0: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
67b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
67c0: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
67d0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
67e0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
67f0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
6800: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
6810: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
6820: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
6830: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
6840: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
6850: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
6860: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
6870: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
6880: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
6890: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
68a0: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
68b0: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
68c0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
68d0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
68e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
68f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6900: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
6910: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
6920: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
6930: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
6940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6950: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
6960: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6970: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
6980: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6990: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
69a0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
69b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
69c0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
69e0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
69f0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
6a00: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
6a10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6a20: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
6a30: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
6a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6a50: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
6a60: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6a70: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6a80: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6a90: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6aa0: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
6ab0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
6ac0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
6ad0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
6ae0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
6af0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
6b00: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
6b10: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6b20: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6b30: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6b40: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6b50: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6b60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6b90: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
6ba0: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
6bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6bc0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
6bd0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
6be0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
6bf0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
6c00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6c10: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6c20: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
6c30: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
6c40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6c50: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
6c60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6c70: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
6c80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
6c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
6ca0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
6cb0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6cc0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
6cd0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
6ce0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
6cf0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
6d00: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
6d10: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
6d20: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
6d30: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
6d40: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
6d50: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
6d60: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6d70: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
6d80: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6d90: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6da0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6db0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
6dd0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
6de0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6df0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
6e00: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
6e10: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
6e20: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
6e30: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
6e40: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
6e50: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
6e60: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
6e70: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
6e80: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
6e90: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
6eb0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6ec0: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
6ed0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
6ee0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
6ef0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
6f00: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
6f10: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
6f20: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6f30: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
6f40: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
6f50: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
6f60: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
6f70: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
6f80: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
6f90: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
6fa0: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
6fb0: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
6fc0: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
6fd0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
6fe0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
6ff0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
7000: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
7010: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
7020: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
7030: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
7040: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
7050: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
7060: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
7070: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7080: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7090: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
70a0: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
70b0: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
70c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
70d0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
70e0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
70f0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
7100: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
7110: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
7120: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
7130: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7140: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7150: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7160: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7170: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7180: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7190: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
71a0: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
71b0: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
71c0: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
71d0: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
71e0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
71f0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7200: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7210: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7220: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7230: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7240: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7250: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7260: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7270: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7280: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7290: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
72a0: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
72b0: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
72c0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
72d0: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
72e0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
72f0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7300: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7310: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7320: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7330: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7340: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7350: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7360: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7370: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7380: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7390: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
73a0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
73b0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
73c0: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
73d0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
73e0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
73f0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7400: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7410: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7420: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7430: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7440: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7450: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7460: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7470: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7480: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7490: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
74a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
74b0: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
74c0: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
74d0: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
74e0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
74f0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7500: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7510: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7520: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7530: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7540: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7550: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7560: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7570: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7580: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7590: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
75a0: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
75b0: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
75c0: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
75d0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
75e0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
75f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7600: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7610: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7620: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7630: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7640: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7650: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7660: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7670: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7680: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7690: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
76a0: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
76b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
76c0: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
76d0: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
76e0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
76f0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7700: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7710: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7720: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7730: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
7740: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7750: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7760: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7770: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7780: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
7790: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
77a0: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
77b0: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
77c0: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
77d0: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
77e0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
77f0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
7800: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
7810: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
7820: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
7830: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
7840: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
7850: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
7860: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
7870: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
7880: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
7890: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
78a0: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
78b0: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
78c0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
78d0: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
78e0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
78f0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
7900: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
7910: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
7920: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
7930: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
7940: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
7950: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
7960: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
7970: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
7980: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
7990: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
79a0: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
79b0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
79c0: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
79d0: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
79e0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
79f0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
7a00: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7a10: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
7a20: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
7a30: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
7a50: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
7a60: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7a80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7a90: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7aa0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
7ab0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
7ac0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
7ad0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
7ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7af0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
7b00: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7b10: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
7b20: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
7b30: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
7b40: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7b50: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
7b60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7b70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7b80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7b90: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
7ba0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
7bb0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7bc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
7bd0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7be0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7bf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
7c20: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
7c30: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7c40: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
7c50: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
7c60: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
7c70: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7ca0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
7cb0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
7cc0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
7cd0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
7ce0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
7cf0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
7d00: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
7d10: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
7d20: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
7d30: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
7d40: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
7d50: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7d60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7d70: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
7d80: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
7d90: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7da0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7db0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
7dc0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
7dd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
7de0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
7df0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
7e00: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
7e10: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
7e20: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7e30: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
7e40: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
7e50: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
7e60: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
7e70: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
7e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
7e90: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
7ea0: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
7eb0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
7ec0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
7ed0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
7ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
7ef0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7f00: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
7f10: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
7f20: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
7f30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7f40: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
7f50: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
7f60: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
7f70: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7f80: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
7f90: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
7fa0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
7fb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
7fc0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
7fd0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
7fe0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
7ff0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
8000: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
8010: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68   pMaskSet);.  wh
8020: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
8030: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
8040: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8050: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
8060: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
8070: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8080: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
8090: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
80a0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
80b0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
80c0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
80d0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
80e0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
80f0: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
8100: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8110: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
8120: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8130: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8140: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
8150: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
8160: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8170: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
8180: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8190: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
81a0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
81b0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
81c0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
81d0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
81e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
81f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8200: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8210: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
8220: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
8230: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
8240: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
8250: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8260: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
8270: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
8280: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8290: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
82a0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
82b0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
82c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
82d0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
82e0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
82f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
8300: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8310: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8320: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8330: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
8340: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
8350: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
8360: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
8370: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
8380: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8390: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
83a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
83b0: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
83c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
83d0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
83e0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
83f0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8400: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8410: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
8420: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8430: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8440: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8450: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8460: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8470: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8480: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8490: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
84a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
84b0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
84c0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
84d0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
84e0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
84f0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8500: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8510: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8520: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8530: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8550: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8560: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8570: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8580: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8590: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
85a0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
85b0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
85c0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
85d0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
85e0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
85f0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8600: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8610: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8630: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8640: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8650: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8660: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8670: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8680: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8690: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
86a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
86b0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
86c0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
86d0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
86e0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
86f0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
8700: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
8710: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
8720: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
8730: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
8740: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
8750: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
8760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8770: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
8780: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8790: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
87a0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
87b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
87c0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
87d0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
87e0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
87f0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
8800: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
8810: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
8820: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
8830: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
8840: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
8850: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
8860: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8870: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
8880: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
8890: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
88a0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
88b0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
88c0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
88d0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
88e0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
88f0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
8900: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
8910: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
8920: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
8930: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
8940: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
8950: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
8960: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
8970: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
8980: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
8990: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
89a0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
89b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
89c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
89d0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
89e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
89f0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
8a00: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
8a10: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
8a20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
8a30: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
8a40: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
8a50: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
8a60: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
8a70: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
8a80: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
8a90: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
8aa0: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
8ab0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
8ac0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
8ad0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
8ae0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
8af0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
8b00: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
8b10: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
8b20: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
8b30: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
8b40: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
8b50: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
8b60: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
8b70: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
8b80: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
8b90: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
8ba0: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
8bb0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
8bc0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
8bd0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
8be0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8bf0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
8c00: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
8c10: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
8c20: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8c30: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
8c40: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
8c50: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
8c60: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
8c70: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
8c80: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
8c90: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
8ca0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
8cb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8cc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8cd0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
8ce0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
8cf0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
8d00: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8d10: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
8d20: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
8d30: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
8d40: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
8d50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
8d60: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
8d70: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
8d80: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
8d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8da0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8db0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8dc0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8dd0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8de0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8df0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8e00: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8e10: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8e20: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8e30: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8e40: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
8e50: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
8e60: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
8e70: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
8e80: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
8e90: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8ea0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8eb0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8ec0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8ed0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8ee0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8ef0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8f00: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8f10: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8f20: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8f30: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8f40: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
8f50: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
8f60: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8f70: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
8f80: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fa0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8fb0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8fc0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8fd0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8fe0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8ff0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9000: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9020: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
9030: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
9040: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9050: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
9060: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9070: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9080: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9090: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
90a0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
90b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
90c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
90d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
90e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
90f0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9100: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9110: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9120: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9130: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9140: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9150: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9160: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9170: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9180: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9190: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
91a0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
91b0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
91c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
91d0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
91e0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
91f0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9200: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9210: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9220: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9230: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9240: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9250: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9260: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9270: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9280: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9290: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
92a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
92b0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
92c0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
92d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
92e0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
92f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9300: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9310: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9320: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9330: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9340: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9350: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9360: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9370: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9380: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9390: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
93a0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
93b0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
93c0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
93d0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
93e0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
93f0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9400: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9410: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9420: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9430: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9440: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9450: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9480: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9490: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
94a0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
94b0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
94c0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
94d0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
94e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
94f0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9500: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9510: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9520: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9530: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9540: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9550: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9560: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9580: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9590: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
95a0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
95b0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
95c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
95d0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
95e0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
95f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9600: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9610: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9630: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9650: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9660: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9680: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9690: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
96a0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
96b0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
96c0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
96d0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
96e0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
96f0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
9700: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
9710: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
9720: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
9730: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
9740: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
9750: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
9760: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9770: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9780: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
9790: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
97a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
97b0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
97c0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
97e0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
97f0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
9800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
9810: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9820: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
9840: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
9850: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
9860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9870: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9880: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9890: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
98a0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
98b0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
98c0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
98d0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
98e0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
98f0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
9900: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
9910: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
9920: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
9930: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a  operator..    **
9940: 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30  .    ** EV: R-00
9950: 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f  211-15100.    */
9960: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
9970: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
9980: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
9990: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
99a0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
99b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
99c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
99d0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
99e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
99f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9a00: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
9a10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
9a20: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9a30: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
9a40: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9a50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
9a60: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
9a70: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
9a80: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
9a90: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9aa0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9ab0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9ac0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
9ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9ae0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
9af0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
9b00: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9b10: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
9b20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b30: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
9b40: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9b50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b60: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
9b70: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
9b80: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
9b90: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9ba0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9bb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9bc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9be0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
9bf0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9c00: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9c10: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9c20: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9c30: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c40: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9c50: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9c60: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9c70: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
9c80: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
9c90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9ca0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
9cb0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
9cc0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
9cd0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9ce0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9cf0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9d10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9d20: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9d30: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9d40: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9d50: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9d60: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9d70: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9d80: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
9d90: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
9da0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9db0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
9dc0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
9dd0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9de0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9df0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9e00: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9e10: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9e20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9e30: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9e40: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9e70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
9e80: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9e90: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
9ea0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
9eb0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
9ec0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
9ed0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9ee0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9ef0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9f00: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9f10: 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  BQUERY */.../*.*
9f20: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
9f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9f40: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
9f50: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
9f60: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
9f70: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
9f80: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
9f90: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
9fa0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
9fb0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
9fc0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
9fd0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9fe0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
9ff0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
a000: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a010: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
a020: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
a030: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
a040: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
a050: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
a060: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
a070: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a080: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
a090: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
a0a0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
a0b0: 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c  and Y are.** col
a0c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
a0d0: 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69  riginal expressi
a0e0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
a0f0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
a100: 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65  l.** term of the
a110: 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22   form "Y <op> X"
a120: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
a140: 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65  d.** analyzed se
a150: 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f  parately.  The o
a160: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20  riginal term is 
a170: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
a180: 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74  _COPIED.** and t
a190: 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d  he new term is m
a1a0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
a1b0: 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65  DYNAMIC (because
a1c0: 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e   it's pExpr.** n
a1d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
a1e0: 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43   with the WhereC
a1f0: 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f  lause) and TERM_
a200: 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65  VIRTUAL (because
a210: 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d   it.** is a comm
a220: 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70  uted copy of a p
a230: 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65  rior term.)  The
a240: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68   original term h
a250: 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61  as nChild=1.** a
a260: 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20  nd the copy has 
a270: 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f  idxParent set to
a280: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
a290: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
a2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a2b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
a2c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
a2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a2e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a2f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a300: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
a310: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a320: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
a350: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
a360: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
a370: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
a380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a390: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
a3a0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
a3b0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
a3c0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
a3d0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
a3e0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
a3f0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a410: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a420: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a430: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
a440: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
a450: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
a460: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
a470: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
a480: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
a490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a4a0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
a4b0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
a4c0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
a4d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
a4e0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
a4f0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
a500: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
a510: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
a520: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
a530: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
a540: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
a550: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a570: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a580: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
a590: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
a5a0: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
a5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
a5c0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
a5d0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
a5e0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
a610: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
a620: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
a630: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
a640: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
a650: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
a660: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a670: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
a680: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a690: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
a6a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a6b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
a6c0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
a6d0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
a6e0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
a6f0: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
a700: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
a710: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
a720: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
a730: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
a740: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
a750: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
a760: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
a770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
a780: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
a790: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
a7a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a7b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a7c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a7d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a7e0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
a7f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a800: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
a810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a820: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a830: 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  t = exprListTabl
a840: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a850: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
a860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
a870: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
a880: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
a890: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
a8a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
a8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a8c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
a8d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a8e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
a8f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
a900: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
a910: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
a920: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a930: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
a940: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
a950: 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d  Bitmask x = getM
a960: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
a970: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
a980: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
a990: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
a9a0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
a9b0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
a9c0: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
a9d0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
a9e0: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
a9f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
aa00: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
aa10: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
aa20: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a  et #3015 */.  }.
aa30: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
aa40: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
aa50: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
aa60: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
aa70: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
aa80: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
aa90: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
aaa0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
aab0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
aac0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
aad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
aae0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
aaf0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
ab00: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
ab10: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
ab20: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
ab30: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
ab40: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ab50: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ab60: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
ab70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
ab80: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
ab90: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
aba0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
abb0: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
abc0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
abd0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
abe0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
abf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
ac00: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
ac10: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
ac20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
ac30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
ac40: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
ac50: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
ac60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
ac70: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
ac80: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ac90: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
aca0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
acb0: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
acc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
acd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ace0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
acf0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
ad00: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
ad10: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ad20: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
ad30: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
ad40: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
ad50: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
ad60: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
ad70: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
ad80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
ad90: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ada0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
adb0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
adc0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
add0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
ade0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
adf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
ae00: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
ae10: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
ae20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae30: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
ae40: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
ae50: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
ae60: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
ae70: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ae80: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
ae90: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
aea0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aeb0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
aec0: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
aed0: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
aee0: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
aef0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
af00: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
af10: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
af20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
af30: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
af40: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
af50: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
af60: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
af70: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
af80: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
afa0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
afb0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
afc0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
afd0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
afe0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
aff0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
b000: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
b010: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
b020: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
b030: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
b040: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
b050: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
b060: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
b070: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
b080: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
b090: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
b0a0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
b0b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
b0c0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
b0d0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
b0e0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
b0f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
b100: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
b110: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
b120: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
b130: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b140: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
b150: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
b160: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
b170: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
b180: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
b190: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
b1a0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
b1b0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
b1c0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
b1d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
b1e0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
b1f0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
b200: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
b210: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
b220: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
b230: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
b240: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
b250: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b260: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
b270: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
b280: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
b290: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
b2a0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
b2b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
b2c0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
b2d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
b2e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b2f0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
b300: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
b310: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
b320: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b330: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b360: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b370: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
b3b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
b3c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b3d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b3e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b3f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
b400: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b410: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
b420: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
b430: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
b440: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b450: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
b460: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b470: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
b480: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
b490: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b4a0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
b4b0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
b4c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b4d0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
b4e0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
b4f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b500: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b510: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
b520: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b530: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
b540: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
b550: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
b560: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
b570: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
b580: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
b590: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
b5a0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
b5b0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
b5c0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
b5d0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
b5e0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
b5f0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
b600: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
b610: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b620: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
b630: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b640: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
b650: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b660: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
b670: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
b680: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
b690: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
b6a0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
b6b0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
b6c0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
b6d0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
b6e0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
b6f0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
b700: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
b710: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
b720: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
b730: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
b740: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
b750: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
b760: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
b770: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
b780: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
b790: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
b7a0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
b7b0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
b7c0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
b7d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
b7e0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
b7f0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
b800: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
b810: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
b820: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
b830: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
b840: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b850: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b860: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
b870: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
b880: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
b890: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
b8a0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
b8b0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
b8c0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
b8d0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
b8e0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
b8f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b900: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
b910: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
b920: 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  se */..    pLeft
b930: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b940: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
b950: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
b960: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
b970: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
b980: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b990: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b9a0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b9b0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b9c0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b9d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b9e0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b9f0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
ba00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
ba10: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
ba20: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
ba30: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
ba40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
ba50: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
ba60: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
ba70: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
ba80: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
ba90: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
baa0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
bab0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
bac0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
bad0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
bae0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
baf0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
bb00: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
bb10: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
bb20: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
bb30: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
bb40: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
bb50: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
bb60: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
bb70: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
bb80: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
bb90: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
bba0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
bbb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bbc0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
bbd0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
bbe0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
bbf0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
bc00: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
bc10: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
bc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc30: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
bc40: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
bc50: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bc60: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
bc70: 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43  8, noCase ? "NOC
bc80: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c  ASE" : "BINARY",
bc90: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
bca0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
bcb0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bce0: 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33  rSetColl(sqlite3
bcf0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
bd00: 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20  ,0), pColl),.   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20    pStr1, 0);.   
bd30: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
bd40: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
bd50: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
bd60: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
bd70: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
bd80: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
bd90: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
bda0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
bdb0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
bdc0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
bdd0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bde0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
bdf0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be00: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
be10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
be20: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
be30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be40: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
be50: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
be60: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
be70: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
be80: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be90: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
bea0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
beb0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
bec0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
bed0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
bee0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bef0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
bf00: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
bf10: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
bf20: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
bf30: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
bf40: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
bf50: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
bf60: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
bf70: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
bf80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
bf90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
bfa0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
bfb0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
bfc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bfd0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
bfe0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
bff0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c000: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c010: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c020: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c030: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c040: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c050: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c060: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c070: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c080: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c090: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c0a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c0b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c0c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c0d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c0e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c0f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
c100: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
c110: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
c120: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
c130: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
c140: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
c150: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
c160: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
c170: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
c180: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
c190: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c1a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c1b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
c1c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
c1d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
c1e0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
c1f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c200: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
c210: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
c220: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c230: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
c240: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
c250: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
c260: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
c270: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
c280: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
c290: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c2a0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
c2d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c2e0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
c2f0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
c300: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c310: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c320: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
c330: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c340: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c350: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
c360: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
c370: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
c380: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c390: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
c3a0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
c3b0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c3c0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c3d0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c3e0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c3f0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
c400: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
c410: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c420: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
c430: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c440: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c450: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c460: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c470: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c480: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c490: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c4a0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c4b0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c4c0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c4d0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c4e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c4f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c500: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
c510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c520: 54 41 54 32 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT2.  /* When s
c530: 71 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74  qlite_stat2 hist
c540: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
c550: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
c560: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
c570: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
c580: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
c590: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
c5a0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
c5b0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
c5c0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
c5d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c5e0: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
c5f0: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
c600: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
c610: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
c620: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
c630: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
c640: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
c650: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
c660: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
c670: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
c680: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
c690: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
c6a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
c6b0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
c6c0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
c6d0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
c6e0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
c6f0: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
c700: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
c710: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
c720: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
c730: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
c740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
c750: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
c760: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
c770: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
c780: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
c790: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
c7a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
c7b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
c7c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
c7d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
c7e0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
c7f0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
c800: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
c810: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c820: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
c850: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c880: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c890: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
c8a0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
c8b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c8c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c8d0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
c900: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
c910: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
c920: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
c930: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c940: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c950: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c960: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
c970: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c980: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c990: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c9a0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c9b0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c9c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c9d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c9e0: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
c9f0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
ca00: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ca10: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
ca20: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ca30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
ca40: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ca50: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
ca60: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
ca70: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ca80: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
ca90: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
caa0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
cab0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
cac0: 53 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a 20 50  STAT2 */..  /* P
cad0: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
cae0: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
caf0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
cb00: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
cb10: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
cb20: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
cb30: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
cb40: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
cb50: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
cb60: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
cb70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cb80: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
cb90: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
cba0: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
cbb0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
cbc0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
cbd0: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
cbe0: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
cbf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cc00: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
cc10: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
cc20: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
cc30: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
cc40: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
cc50: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
cc60: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
cc70: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
cc80: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
cc90: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
cca0: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
ccb0: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
ccc0: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
ccd0: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
cce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
cd10: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
cd20: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
cd30: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
cd40: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
cd50: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
cd60: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
cd70: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
cd80: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
cd90: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
cda0: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
cdb0: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
cdc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cdd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
cde0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cdf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ce00: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
ce10: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
ce20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
ce30: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
ce40: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
ce50: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
ce60: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
ce70: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
ce80: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
ce90: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
cea0: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
ceb0: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
cec0: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
ced0: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
cee0: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
cef0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
cf00: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
cf10: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
cf20: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
cf30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
cf40: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
cf50: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
cf60: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
cf70: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
cf80: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
cf90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
cfa0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
cfb0: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
cfc0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
cfd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
cfe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
cff0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d010: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d020: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d030: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d060: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d070: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d080: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0a0: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d0b0: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d0c0: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0e0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d0f0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d100: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d110: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d120: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d130: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d140: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d150: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d160: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d170: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
d180: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
d190: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
d1a0: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
d1b0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
d1c0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
d1d0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
d1e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
d1f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
d200: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
d210: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
d220: 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69  Coll) && 0==sqli
d230: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
d240: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
d250: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d260: 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n i;.      }.   
d270: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
d280: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
d290: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72  is routine deter
d2a0: 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20 63 61  mines if pIdx ca
d2b0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 73 73  n be used to ass
d2c0: 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  ist in processin
d2d0: 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20  g a.** DISTINCT 
d2e0: 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74  qualifier. In ot
d2f0: 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65  her words, it te
d300: 73 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  sts whether or n
d310: 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a  ot using this.**
d320: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f   index for the o
d330: 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e  uter loop guaran
d340: 74 65 65 73 20 74 68 61 74 20 72 6f 77 73 20 77  tees that rows w
d350: 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73  ith equal values
d360: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72   for.** all expr
d370: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70  essions in the p
d380: 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72  Distinct list ar
d390: 65 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75  e delivered grou
d3a0: 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  ped together..**
d3b0: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
d3c0: 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a   the query .**.*
d3d0: 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  *   SELECT DISTI
d3e0: 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  NCT a, b, c FROM
d3f0: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f   tbl WHERE a = ?
d400: 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66  .**.** can benef
d410: 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65  it from any inde
d420: 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22  x on columns "b"
d430: 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61   and "c"..*/.sta
d440: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
d450: 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ctIndex(.  Parse
d460: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d480: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d490: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
d4a0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
d4b0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
d4c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65  clause */.  Inde
d4d0: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d4f0: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
d500: 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69  onsidered */.  i
d510: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d530: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
d540: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 49  for the table pI
d550: 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78  dx is on */.  Ex
d560: 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63  prList *pDistinc
d570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
d580: 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 65 78   The DISTINCT ex
d590: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69  pressions */.  i
d5a0: 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20  nt nEqCol       
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
d5d0: 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d  x columns with =
d5e0: 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  = */.){.  Bitmas
d5f0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  k mask = 0;     
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
d610: 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64  k of unaccounted
d620: 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65   for pDistinct e
d630: 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  xprs */.  int i;
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d660: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
d670: 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  /..  if( pIdx->z
d680: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74  Name==0 || pDist
d690: 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74  inct==0 || pDist
d6a0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53  inct->nExpr>=BMS
d6b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
d6c0: 65 73 74 63 61 73 65 28 20 70 44 69 73 74 69 6e  estcase( pDistin
d6d0: 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  ct->nExpr==BMS-1
d6e0: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   );..  /* Loop t
d6f0: 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65  hrough all the e
d700: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
d710: 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e  e distinct list.
d720: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a   If any of them.
d730: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d    ** are not sim
d740: 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  ple column refer
d750: 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61  ences, return ea
d760: 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rly. Otherwise, 
d770: 74 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a  test if the.  **
d780: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
d790: 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22  ntains a "col=X"
d7a0: 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64   clause. If it d
d7b0: 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73  oes, the express
d7c0: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ion.  ** can be 
d7d0: 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64  ignored. If it d
d7e0: 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65  oes not, and the
d7f0: 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74   column does not
d800: 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20   belong to the. 
d810: 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61   ** same table a
d820: 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65  s index pIdx, re
d830: 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61  turn early. Fina
d840: 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73  lly, if there is
d850: 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e   no.  ** matchin
d860: 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73  g "col=X" expres
d870: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c  sion and the col
d880: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61  umn is on the sa
d890: 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78  me table as pIdx
d8a0: 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63  ,.  ** set the c
d8b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
d8c0: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73   in variable mas
d8d0: 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  k..  */.  for(i=
d8e0: 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e  0; i<pDistinct->
d8f0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d900: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
d910: 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  m;.    Expr *p =
d920: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d   pDistinct->a[i]
d930: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d940: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
d950: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
d960: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
d970: 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65  m(pWC, p->iTable
d980: 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28  , p->iColumn, ~(
d990: 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51  Bitmask)0, WO_EQ
d9a0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
d9b0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  erm ){.      Exp
d9c0: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
d9d0: 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
d9e0: 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65  Seq *p1 = sqlite
d9f0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
da00: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
da10: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
da20: 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ght);.      Coll
da30: 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65  Seq *p2 = sqlite
da40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
da50: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
da60: 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74  f( p1==p2 ) cont
da70: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
da80: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62  if( p->iTable!=b
da90: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
daa0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42      mask |= (((B
dab0: 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b  itmask)1) << i);
dac0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45  .  }..  for(i=nE
dad0: 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c  qCol; mask && i<
dae0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
daf0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78  ++){.    int iEx
db00: 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  pr = findIndexCo
db10: 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
db20: 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c  nct, base, pIdx,
db30: 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78   i);.    if( iEx
db40: 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  pr<0 ) break;.  
db50: 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69    mask &= ~(((Bi
db60: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70  tmask)1) << iExp
db70: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
db80: 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a  n (mask==0);.}..
db90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
dba0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
dbb0: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
dbc0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
dbd0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
dbe0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
dbf0: 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74   A DISTINCT list
dc00: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66   is redundant if
dc10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
dc20: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51  ntains a.** UNIQ
dc30: 55 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75  UE index that gu
dc40: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
dc50: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
dc60: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69  query will be di
dc70: 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79  stinct.** anyway
dc80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dc90: 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64  isDistinctRedund
dca0: 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ant(.  Parse *pP
dcb0: 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20  arse,.  SrcList 
dcc0: 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65  *pTabList,.  Whe
dcd0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
dce0: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
dcf0: 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20  inct.){.  Table 
dd00: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
dd10: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20  pIdx;.  int i;  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
dd40: 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Base;..  /* If t
dd50: 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61  here is more tha
dd60: 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73  n one table or s
dd70: 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65  ub-select in the
dd80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a   FROM clause of.
dd90: 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c    ** this query,
dda0: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
ddb0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
ddc0: 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44   show that the D
ddd0: 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c  ISTINCT .  ** cl
dde0: 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e  ause is redundan
ddf0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  t. */.  if( pTab
de00: 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20  List->nSrc!=1 ) 
de10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73  return 0;.  iBas
de20: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
de30: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54  0].iCursor;.  pT
de40: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
de50: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
de60: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  If any of the ex
de70: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20  pressions is an 
de80: 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61  IPK column on ta
de90: 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20  ble iBase, then 
dea0: 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75  return .  ** tru
deb0: 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d  e. Note: The (p-
dec0: 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20  >iTable==iBase) 
ded0: 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73  part of this tes
dee0: 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69  t may be false i
def0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  f the.  ** curre
df00: 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63  nt SELECT is a c
df10: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75  orrelated sub-qu
df20: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
df30: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
df40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
df50: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69     Expr *p = pDi
df60: 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78  stinct->a[i].pEx
df70: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  pr;.    if( p->o
df80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
df90: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
dfa0: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   && p->iColumn<0
dfb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
dfc0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
dfd0: 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ugh all indices 
dfe0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68  on the table, ch
dff0: 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73  ecking each to s
e000: 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20  ee if it makes. 
e010: 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54   ** the DISTINCT
e020: 20 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e   qualifier redun
e030: 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f  dant. It does so
e040: 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   if:.  **.  **  
e050: 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73   1. The index is
e060: 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20   itself UNIQUE, 
e070: 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  and.  **.  **   
e080: 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f  2. All of the co
e090: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
e0a0: 65 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61  ex are either pa
e0b0: 72 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69  rt of the pDisti
e0c0: 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69  nct.  **      li
e0d0: 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20  st, or else the 
e0e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
e0f0: 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20  tains a term of 
e100: 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22  the form "col=X"
e110: 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72  ,.  **      wher
e120: 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  e X is a constan
e130: 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c  t value. The col
e140: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e150: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   of the.  **    
e160: 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64    comparison and
e170: 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70   select-list exp
e180: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61  ressions must ma
e190: 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65  tch those of the
e1a0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
e1b0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e1c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e1d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e1e0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
e1f0: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20  rror==OE_None ) 
e200: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
e210: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
e220: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
e230: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e240: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
e250: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
e260: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
e270: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
e280: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
e290: 64 78 29 20 0a 20 20 20 20 20 20 20 26 26 20 30  dx) .       && 0
e2a0: 3e 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50  >findIndexCol(pP
e2b0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c  arse, pDistinct,
e2c0: 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29   iBase, pIdx, i)
e2d0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
e2e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e2f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e300: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
e310: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e320: 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74   index implies t
e330: 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54  hat the DISTINCT
e340: 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65   qualifier is re
e350: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20  dundant. */.    
e360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e370: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
e380: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
e390: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
e3a0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
e3b0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
e3c0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
e3d0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
e3e0: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
e3f0: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
e400: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
e410: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e420: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
e430: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
e440: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
e450: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
e460: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
e470: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
e480: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e490: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
e4a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
e4b0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
e4c0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
e4d0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
e4e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
e4f0: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
e500: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
e510: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
e520: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e530: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
e540: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
e550: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
e560: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
e570: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
e580: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
e590: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
e5a0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
e5b0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
e5c0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
e5d0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
e5e0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
e5f0: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
e600: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
e610: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
e620: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
e630: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
e640: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
e650: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
e660: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
e670: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
e680: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
e690: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
e6a0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
e6b0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
e6c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e6d0: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
e6e0: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
e6f0: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
e700: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
e710: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
e720: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
e730: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
e740: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e750: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e760: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
e770: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
e780: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
e790: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
e7a0: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
e7b0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e7d0: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
e7e0: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
e7f0: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
e800: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
e810: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
e820: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
e830: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e840: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
e850: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
e860: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
e870: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
e880: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
e890: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
e8a0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
e8b0: 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73  */.  int wsFlags
e8c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e8d0: 49 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61  Index usages fla
e8e0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  gs */.  int *pbR
e8f0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
e900: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
e910: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
e920: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
e930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e950: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
e960: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e980: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
e990: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
e9a0: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
e9b0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
e9e0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
e9f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ea00: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
ea10: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
ea20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ea30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ea40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ea50: 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79  .  if( !pOrderBy
ea60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ea70: 66 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  f( wsFlags & WHE
ea80: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72  RE_COLUMN_IN ) r
ea90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
eaa0: 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  Idx->bUnordered 
eab0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e  ) return 0;..  n
eac0: 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
ead0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
eae0: 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20  ( nTerm>0 );..  
eaf0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  /* Argument pIdx
eb00: 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
eb10: 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e  nt to a 'real' n
eb20: 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63  amed index struc
eb30: 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61  ture, .  ** or a
eb40: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
eb50: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74  e allocated on t
eb60: 68 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74  he stack by best
eb70: 42 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a  BtreeIndex() to.
eb80: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74    ** represent t
eb90: 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74  he rowid index t
eba0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65  hat is part of e
ebb0: 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  very table.  */.
ebc0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
ebd0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e  zName || (pIdx->
ebe0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
ebf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
ec00: 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  =-1) );..  /* Ma
ec10: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
ec20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ec30: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
ec40: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
ec50: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
ec60: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
ec70: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
ec80: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
ec90: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
eca0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
ecb0: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
ecc0: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
ecd0: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
ece0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
ecf0: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
ed00: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
ed10: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
ed20: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
ed30: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
ed40: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
ed50: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
ed60: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
ed70: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
ed80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
ed90: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
eda0: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
edb0: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
edc0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
edd0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ede0: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
edf0: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
ee00: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
ee10: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
ee20: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
ee30: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
ee40: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
ee50: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
ee60: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
ee70: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
ee80: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
ee90: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
eea0: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
eeb0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
eec0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
eed0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
eee0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
eef0: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
ef00: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
ef10: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
ef20: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
ef30: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
ef40: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
ef50: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
ef60: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
ef70: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
ef80: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
ef90: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
efa0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
efb0: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
efc0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
efd0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
efe0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
eff0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f000: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
f010: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
f020: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
f030: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
f040: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
f050: 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26  f( pIdx->zName &
f060: 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  & i<pIdx->nColum
f070: 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  n ){.      iColu
f080: 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  mn = pIdx->aiCol
f090: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
f0a0: 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ( iColumn==pIdx-
f0b0: 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29  >pTable->iPKey )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  {.        iColum
f0d0: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  n = -1;.      }.
f0e0: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
f0f0: 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
f100: 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  der[i];.      zC
f110: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
f120: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ll[i];.    }else
f130: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
f140: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72  = -1;.      iSor
f150: 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  tOrder = 0;.    
f160: 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d    zColl = pColl-
f170: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20  >zName;.    }.  
f180: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
f190: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c  lumn!=iColumn ||
f1a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f1b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
f1c0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  oll) ){.      /*
f1d0: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
f1e0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
f1f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
f200: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
f210: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
f220: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
f230: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
f240: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
f250: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
f260: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
f270: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
f280: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
f290: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
f2a0: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
f2b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
f2c0: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
f2d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
f2e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f2f0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
f300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
f310: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73  ndex column i is
f320: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c   the rowid.  All
f330: 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74   other terms mat
f340: 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ch. */.        b
f350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
f360: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
f370: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
f380: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
f390: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
f3a0: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
f3b0: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
f3c0: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
f3d0: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
f3e0: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
f3f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f410: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f420: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72  sert( pIdx->aSor
f430: 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f  tOrder!=0 || iCo
f440: 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  lumn==-1 );.    
f450: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73  assert( pTerm->s
f460: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
f470: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
f480: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
f490: 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( iSortOrder==0 
f4a0: 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31  || iSortOrder==1
f4b0: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
f4c0: 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64  Order = iSortOrd
f4d0: 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  er ^ pTerm->sort
f4e0: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
f4f0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
f500: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
f510: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
f520: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
f530: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
f540: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
f550: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
f560: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
f570: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f580: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
f590: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
f5a0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f5b0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
f5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
f5d0: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
f5e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
f5f0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
f600: 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  m++;.    if( iCo
f610: 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72  lumn<0 && !refer
f620: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
f630: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
f640: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
f650: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
f660: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
f670: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
f680: 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e  ey and everythin
f690: 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20  g matches.      
f6a0: 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f  ** so far and no
f6b0: 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
f6c0: 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  BY terms to the 
f6d0: 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20  right reference 
f6e0: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  other.      ** t
f6f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
f700: 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  n, then we are a
f710: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
f720: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
f730: 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73  d .      ** to s
f740: 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ort because the 
f750: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
f760: 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e  nique and so non
f770: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20  e of the other. 
f780: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
f790: 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69  will make any di
f7a0: 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  fference.      *
f7b0: 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72  /.      j = nTer
f7c0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
f7d0: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
f7e0: 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d  er!=0;.  if( j>=
f7f0: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  nTerm ){.    /* 
f800: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
f810: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f820: 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
f830: 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20  this index so.  
f840: 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20    ** this index 
f850: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
f860: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  sorting. */.    
f870: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f880: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
f890: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d  r!=OE_None && i=
f8a0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  =pIdx->nColumn. 
f8b0: 20 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73       && (wsFlags
f8c0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
f8d0: 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26  NULL)==0.      &
f8e0: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
f8f0: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
f900: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
f910: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  base) ){.    /* 
f920: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69  All terms of thi
f930: 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f  s index match so
f940: 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  me prefix of the
f950: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f960: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
f970: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20  index is UNIQUE 
f980: 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20  and no terms on 
f990: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
f9a0: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
f9b0: 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65  clause reference
f9c0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
f9d0: 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69   a join.  If thi
f9e0: 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68  s is all true th
f9f0: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  en.    ** the or
fa00: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73  der by clause is
fa10: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e   superfluous.  N
fa20: 6f 74 20 74 68 61 74 20 69 66 20 74 68 65 20 6d  ot that if the m
fa30: 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63  atching.    ** c
fa40: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e  ondition is IS N
fa50: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
fa60: 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ult is not neces
fa70: 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20  sarily unique.  
fa80: 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55    ** even on a U
fa90: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20  NIQUE index, so 
faa0: 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63  disallow those c
fab0: 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ases. */.    ret
fac0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
fad0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fae0: 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20  Prepare a crude 
faf0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
fb00: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
fb10: 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a   input value..**
fb20: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65   The results nee
fb30: 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20  d not be exact. 
fb40: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   This is only us
fb50: 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e  ed for estimatin
fb60: 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63  g.** the total c
fb70: 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e  ost of performin
fb80: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74  g operations wit
fb90: 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e  h O(logN) or O(N
fba0: 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78  logN).** complex
fbb0: 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20  ity.  Because N 
fbc0: 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c  is just a guess,
fbd0: 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20   it is no great 
fbe0: 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f  tragedy if.** lo
fbf0: 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f  gN is a little o
fc00: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ff..*/.static do
fc10: 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62  uble estLog(doub
fc20: 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20  le N){.  double 
fc30: 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62  logN = 1;.  doub
fc40: 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69  le x = 10;.  whi
fc50: 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c  le( N>x ){.    l
fc60: 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20  ogN += 1;.    x 
fc70: 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74  *= 10;.  }.  ret
fc80: 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a  urn logN;.}../*.
fc90: 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20  ** Two routines 
fca0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65  for printing the
fcb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73   content of an s
fcc0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fcd0: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  o.** structure. 
fce0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
fcf0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
fd00: 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65  only.  If neithe
fd10: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  r.** SQLITE_TEST
fd20: 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47   or SQLITE_DEBUG
fd30: 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68   are defined, th
fd40: 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  en these routine
fd50: 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  s.** are no-ops.
fd60: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
fd70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
fd80: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
fd90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
fda0: 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
fdb0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
fdc0: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
fdd0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
fde0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
fdf0: 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
fe00: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
fe10: 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
fe20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
fe30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fe40: 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d    constraint[%d]
fe50: 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d  : col=%d termid=
fe60: 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64  %d op=%d usabled
fe70: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
fe80: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
fe90: 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75  straint[i].iColu
fea0: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  mn,.       p->aC
feb0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
fec0: 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20  rmOffset,.      
fed0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
fee0: 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d  i].op,.       p-
fef0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
ff00: 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66  usable);.  }.  f
ff10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72  or(i=0; i<p->nOr
ff20: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
ff30: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
ff40: 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25  ntf("  orderby[%
ff50: 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d  d]: col=%d desc=
ff60: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
ff70: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
ff80: 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  rBy[i].iColumn,.
ff90: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
ffa0: 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d  By[i].desc);.  }
ffb0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  .}.static void T
ffc0: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
ffd0: 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69  (sqlite3_index_i
ffe0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  nfo *p){.  int i
fff0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10000 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74  WhereTrace ) ret
10010 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
10020 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
10030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10040 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10050 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67    usage[%d]: arg
10060 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c  vIdx=%d omit=%d\
10070 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
10080 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
10090 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
100a0 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d  Index,.       p-
100b0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
100c0 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a  e[i].omit);.  }.
100d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
100e0 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25  intf("  idxNum=%
100f0 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29  d\n", p->idxNum)
10100 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
10110 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72  Printf("  idxStr
10120 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74  =%s\n", p->idxSt
10130 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  r);.  sqlite3Deb
10140 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
10150 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e  rByConsumed=%d\n
10160 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  ", p->orderByCon
10170 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  sumed);.  sqlite
10180 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
10190 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67  estimatedCost=%g
101a0 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65  \n", p->estimate
101b0 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a  dCost);.}.#else.
101c0 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
101d0 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66  X_INPUTS(A).#def
101e0 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ine TRACE_IDX_OU
101f0 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a  TPUTS(A).#endif.
10200 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64  ./* .** Required
10210 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64   because bestInd
10220 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ex() is called b
10230 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e  y bestOrClauseIn
10240 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63  dex() .*/.static
10250 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
10260 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65  .    Parse*, Whe
10270 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63  reClause*, struc
10280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c  t SrcList_item*,
10290 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69  .    Bitmask, Bi
102a0 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a  tmask, ExprList*
102b0 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a  , WhereCost*);..
102c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
102d0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
102e0 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20  ind an scanning 
102f0 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61  strategy that ca
10300 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  n be used .** to
10310 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52   optimize an 'OR
10320 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ' expression tha
10330 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57  t is part of a W
10340 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a  HERE clause. .**
10350 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73  .** The table as
10360 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52  sociated with FR
10370 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
10380 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65  Src may be eithe
10390 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42  r a.** regular B
103a0 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61  -Tree table or a
103b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
103d0 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
103e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
103f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10400 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10410 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
10420 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10440 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10450 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10460 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10470 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10480 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
10490 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
104a0 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
104b0 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
104c0 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
104d0 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
104e0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
104f0 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
10500 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
10510 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
10520 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
10530 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
10540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10560 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
10570 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
10580 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
10590 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
105a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
105b0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
105c0 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74  TION.  const int
105d0 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
105e0 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
105f0 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
10600 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
10610 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69  ed */.  const Bi
10620 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20  tmask maskSrc = 
10630 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
10640 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f  skSet, iCur);  /
10650 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53  * Bitmask for pS
10660 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  rc */.  WhereTer
10670 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64  m * const pWCEnd
10680 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e   = &pWC->a[pWC->
10690 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f  nTerm];        /
106a0 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
106b0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
106c0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
106d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
106e0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
106f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10700 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61  ..  /* No OR-cla
10710 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  use optimization
10720 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20   allowed if the 
10730 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
10740 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
10750 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20  s.  ** are used 
10760 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
10770 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72  otIndexed || pSr
10780 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a  c->pIndex!=0 ){.
10790 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
107a0 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65  .  /* Search the
107b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
107c0 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65  rms for a usable
107d0 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a   WO_OR term. */.
107e0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
107f0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
10800 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
10810 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
10820 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
10830 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72    && ((pTerm->pr
10840 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53  ereqAll & ~maskS
10850 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  rc) & notReady)=
10860 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
10870 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
10880 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
10890 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  c)!=0 .    ){.  
108a0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
108b0 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
108c0 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
108d0 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
108e0 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
108f0 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
10900 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
10910 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
10920 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
10930 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57     int flags = W
10940 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
10950 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
10960 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  al = 0;.      do
10970 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  uble nRow = 0;. 
10980 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65       Bitmask use
10990 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f  d = 0;..      fo
109a0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
109b0 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
109c0 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
109d0 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
109e0 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20  ost sTermCost;. 
109f0 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
10a00 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
10a10 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
10a20 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
10a30 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
10a40 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
10a50 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
10a60 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
10a70 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
10a80 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
10a90 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
10aa0 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
10ab0 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d  Clause *pAndWC =
10ac0 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
10ad0 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
10ae0 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70       bestIndex(p
10af0 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70  Parse, pAndWC, p
10b00 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
10b10 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65  otValid, 0, &sTe
10b20 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  rmCost);.       
10b30 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
10b40 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
10b50 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
10b60 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65    WhereClause te
10b70 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  mpWC;.          
10b80 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20  tempWC.pParse = 
10b90 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pWC->pParse;.   
10ba0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4d         tempWC.pM
10bb0 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
10bc0 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20 20  askSet;.        
10bd0 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
10be0 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
10bf0 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
10c00 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  rm;.          te
10c10 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
10c20 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10c30 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65 6d  dex(pParse, &tem
10c40 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
10c50 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30  ady, notValid, 0
10c60 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
10c70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10c80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
10c90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10ca0 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54      rTotal += sT
10cb0 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  ermCost.rCost;. 
10cc0 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
10cd0 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52  TermCost.plan.nR
10ce0 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64  ow;.        used
10cf0 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75 73   |= sTermCost.us
10d00 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
10d10 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72  rTotal>=pCost->r
10d20 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  Cost ) break;.  
10d30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10d40 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
10d50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
10d60 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61  increase the sca
10d70 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e  n cost to accoun
10d80 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  t .      ** for 
10d90 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
10da0 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sort. */.      i
10db0 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  f( pOrderBy!=0 )
10dc0 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  {.        WHERET
10dd0 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
10de0 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20  ng increases OR 
10df0 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e 39  cost %.9g to %.9
10e00 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  g\n",.          
10e10 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c            rTotal
10e20 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73  , rTotal+nRow*es
10e30 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20 20  tLog(nRow)));.  
10e40 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
10e50 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
10e60 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10e70 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74    /* If the cost
10e80 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69   of scanning usi
10e90 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20  ng this OR term 
10ea0 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  for optimization
10eb0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73   is.      ** les
10ec0 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
10ed0 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69  nt cost stored i
10ee0 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65  n pCost, replace
10ef0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
10f00 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e      ** of pCost.
10f10 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
10f20 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69  RACE(("... multi
10f30 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25  -index OR cost=%
10f40 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22  .9g nrow=%.9g\n"
10f50 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29  , rTotal, nRow))
10f60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74  ;.      if( rTot
10f70 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  al<pCost->rCost 
10f80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  ){.        pCost
10f90 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c  ->rCost = rTotal
10fa0 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  ;.        pCost-
10fb0 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20  >used = used;.  
10fc0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
10fd0 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  n.nRow = nRow;. 
10fe0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
10ff0 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61  an.wsFlags = fla
11000 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  gs;.        pCos
11010 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20  t->plan.u.pTerm 
11020 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
11030 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11040 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11050 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
11060 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   */.}..#ifndef S
11070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11080 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11090 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
110a0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
110b0 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
110c0 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
110d0 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
110e0 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
110f0 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
11100 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
11110 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
11120 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
11130 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
11140 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
11150 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11170 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
11180 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
11190 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
111a0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
111b0 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
111c0 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
111d0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
111e0 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
111f0 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
11200 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
11210 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
11220 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
11230 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
11240 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
11250 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
11260 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
11270 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72 65  ator!=WO_EQ ) re
11280 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
11290 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
112a0 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  t & notReady)!=0
112b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
112c0 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  ff = pSrc->pTab-
112d0 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c  >aCol[pTerm->u.l
112e0 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  eftColumn].affin
112f0 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ity;.  if( !sqli
11300 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
11310 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  Ok(pTerm->pExpr,
11320 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30   aff) ) return 0
11330 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
11340 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
11350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11360 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
11370 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 70  * If the query p
11380 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70 65  lan for pSrc spe
11390 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74 20  cified in pCost 
113a0 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  is a full table 
113b0 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64 65  scan.** and inde
113c0 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20 28  xing is allows (
113d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e  if there is no N
113e0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
113f0 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f 73  e) and it.** pos
11400 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72 75  sible to constru
11410 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69  ct a transient i
11420 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64 20  ndex that would 
11430 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a 2a  perform better.*
11440 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61  * than a full ta
11450 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77 68  ble scan even wh
11460 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 63  en the cost of c
11470 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
11480 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b 65  index.** is take
11490 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20  n into account, 
114a0 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20 71  then alter the q
114b0 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73 65  uery plan to use
114c0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e   the.** transien
114d0 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
114e0 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74 6f  ic void bestAuto
114f0 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
11500 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11520 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
11530 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11540 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
11550 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11560 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11570 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11580 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
11590 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
115a0 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
115b0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
115d0 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
115e0 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
115f0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ble */.  WhereCo
11600 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
11610 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
11620 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
11630 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e 54  /.){.  double nT
11640 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20  ableRow;        
11650 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68     /* Rows in th
11660 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a 2f  e input table */
11670 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20  .  double logN; 
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11690 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  * log(nTableRow)
116a0 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
116b0 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20  tTempIdx;       
116c0 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63    /* per-query c
116d0 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ost of the trans
116e0 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
116f0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
11700 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
11710 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
11720 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11730 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11740 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11750 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11760 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  >a[] */.  Table 
11770 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
11780 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
11790 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65  ht might be inde
117a0 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  xed */..  if( pP
117b0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
117c0 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  <=(double)1 ){. 
117d0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
117e0 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64  o point in build
117f0 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
11800 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e   index for a sin
11810 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  gle scan */.    
11820 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
11830 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
11840 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
11850 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20  toIndex)==0 ){. 
11860 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
11870 69 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61  indices are disa
11880 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  bled at run-time
11890 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
118a0 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 73 74    }.  if( (pCost
118b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
118c0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
118d0 43 41 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  CAN)!=0 ){.    /
118e0 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68 61 76  * We already hav
118f0 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69  e some kind of i
11900 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f 72 20  ndex in use for 
11910 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20  this query. */. 
11920 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
11930 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
11940 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  dexed ){.    /* 
11950 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  The NOT INDEXED 
11960 63 6c 61 75 73 65 20 61 70 70 65 61 72 73 20 69  clause appears i
11970 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20  n the SQL. */.  
11980 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
11990 69 66 28 20 70 53 72 63 2d 3e 69 73 43 6f 72 72  if( pSrc->isCorr
119a0 65 6c 61 74 65 64 20 29 7b 0a 20 20 20 20 2f 2a  elated ){.    /*
119b0 20 54 68 65 20 73 6f 75 72 63 65 20 69 73 20 61   The source is a
119c0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
119d0 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e 74 20  query. No point 
119e0 69 6e 20 69 6e 64 65 78 69 6e 67 20 69 74 2e 20  in indexing it. 
119f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11a00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
11a10 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
11a20 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20 29 3b   >= (double)1 );
11a30 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63  .  pTable = pSrc
11a40 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65  ->pTab;.  nTable
11a50 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52  Row = pTable->nR
11a60 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20  owEst;.  logN = 
11a70 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  estLog(nTableRow
11a80 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49 64 78  );.  costTempIdx
11a90 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c   = 2*logN*(nTabl
11aa0 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75  eRow/pParse->nQu
11ab0 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20  eryLoop + 1);.  
11ac0 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64 78 3e  if( costTempIdx>
11ad0 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
11ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74  .    /* The cost
11af0 20 6f 66 20 63 72 65 61 74 69 6e 67 20 74 68 65   of creating the
11b00 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
11b10 20 77 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65   would be greate
11b20 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f  r than.    ** do
11b30 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62  ing the full tab
11b40 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72  le scan */.    r
11b50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
11b60 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20   Search for any 
11b70 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
11b80 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57  son term */.  pW
11b90 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70  CEnd = &pWC->a[p
11ba0 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f  WC->nTerm];.  fo
11bb0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
11bc0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
11bd0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
11be0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
11bf0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
11c00 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
11c10 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61    WHERETRACE(("a
11c20 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65  uto-index reduce
11c30 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66  s cost from %.1f
11c40 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20   to %.1f\n",.   
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c 20 63   pCost->rCost, c
11c70 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20  ostTempIdx));.  
11c80 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
11c90 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a   = costTempIdx;.
11ca0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
11cb0 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20  n.nRow = logN + 
11cc0 31 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  1;.      pCost->
11cd0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57  plan.wsFlags = W
11ce0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  HERE_TEMP_INDEX;
11cf0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
11d00 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ed = pTerm->prer
11d10 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62  eqRight;.      b
11d20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11d30 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
11d40 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
11d50 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29 20 20  dex(A,B,C,D,E)  
11d60 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64  /* no-op */.#end
11d70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11d80 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
11d90 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  X */...#ifndef S
11da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11db0 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11dc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11dd0 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
11de0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  Index object for
11df0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
11e00 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65  dex.** and to se
11e10 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65  t up the WhereLe
11e20 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65  vel object pLeve
11e30 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  l so that the co
11e40 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
11e50 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65  makes use of the
11e60 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11e80 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
11e90 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ticIndex(.  Pars
11ea0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11ec0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11ed0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
11ee0 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
11ef0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11f00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
11f10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11f20 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
11f30 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
11f40 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64  get the next ind
11f50 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
11f60 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
11f70 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
11f80 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
11f90 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
11fa0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
11fb0 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f  Level          /
11fc0 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65  * Write new inde
11fd0 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  x here */.){.  i
11fe0 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt nColumn;     
11ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12000 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
12010 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  in the construct
12020 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68  ed index */.  Wh
12030 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
12050 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
12060 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
12070 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
12080 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  WCEnd;          
12090 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
120a0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  [] */.  int nByt
120b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
120c0 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d      /* Byte of m
120d0 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72  emory needed for
120e0 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
120f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12100 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12110 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
12120 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
12130 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61   /* Prepared sta
12160 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
12170 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
12180 6e 74 20 72 65 67 49 73 49 6e 69 74 3b 20 20 20  nt regIsInit;   
12190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
121a0 67 69 73 74 65 72 20 73 65 74 20 62 79 20 69 6e  gister set by in
121b0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
121c0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
121f0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
12200 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
12210 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
12220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12230 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
12240 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
12250 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
12260 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
12270 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
12280 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
12290 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122b0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
122c0 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
122d0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
122f0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12300 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
12310 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
12340 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12370 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
12380 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
12390 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
123a0 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
123b0 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
123c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
123d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
123e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
123f0 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
12400 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
12410 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
12420 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
12430 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
12440 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
12450 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
12460 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
12470 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
12480 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  olumns */..  /* 
12490 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
124a0 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63   skip over the c
124b0 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74  reation and init
124c0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
124d0 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74  e.  ** transient
124e0 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e   index on 2nd an
124f0 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  d subsequent ite
12500 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  rations of the l
12510 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50  oop. */.  v = pP
12520 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
12530 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
12540 20 72 65 67 49 73 49 6e 69 74 20 3d 20 2b 2b 70   regIsInit = ++p
12550 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61  Parse->nMem;.  a
12560 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  ddrInit = sqlite
12570 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12580 50 5f 49 66 2c 20 72 65 67 49 73 49 6e 69 74 29  P_If, regIsInit)
12590 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
125a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
125b0 67 65 72 2c 20 31 2c 20 72 65 67 49 73 49 6e 69  ger, 1, regIsIni
125c0 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  t);..  /* Count 
125d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
125e0 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
125f0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
12600 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75  index.  ** and u
12610 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45  sed to match WHE
12620 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
12630 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75  aints */.  nColu
12640 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  mn = 0;.  pTable
12650 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
12660 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e   pWCEnd = &pWC->
12670 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  a[pWC->nTerm];. 
12680 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
12690 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
126a0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
126b0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
126c0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
126d0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
126e0 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
126f0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
12700 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12710 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
12720 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
12730 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29  BMS ? ((Bitmask)
12740 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28  1)<<(BMS-1) : ((
12750 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c  Bitmask)1)<<iCol
12760 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12770 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
12780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
12790 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
127a0 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73      if( (idxCols
127b0 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   & cMask)==0 ){.
127c0 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b          nColumn+
127d0 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  +;.        idxCo
127e0 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
127f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12800 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
12810 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  >0 );.  pLevel->
12820 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75  plan.nEq = nColu
12830 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  mn;..  /* Count 
12840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64  the number of ad
12850 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
12860 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74   needed to creat
12870 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e  e a.  ** coverin
12880 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76  g index.  A "cov
12890 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20  ering index" is 
128a0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
128b0 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20  ntains all.  ** 
128c0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
128d0 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71   needed by the q
128e0 75 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f  uery.  With a co
128f0 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  vering index, th
12900 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
12910 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64  table never need
12920 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  s to be accessed
12930 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  .  Automatic ind
12940 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ices must.  ** b
12950 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  e a covering ind
12960 65 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69  ex because the i
12970 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
12980 20 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a   updated if the.
12990 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61    ** original ta
129a0 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ble changes and 
129b0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
129c0 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ble cannot both 
129d0 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20  be used.  ** if 
129e0 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73  they go out of s
129f0 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72  ync..  */.  extr
12a00 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f  aCols = pSrc->co
12a10 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c  lUsed & (~idxCol
12a20 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s | (((Bitmask)1
12a30 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20  )<<(BMS-1)));.  
12a40 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62  mxBitCol = (pTab
12a50 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d  le->nCol >= BMS-
12a60 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61  1) ? BMS-1 : pTa
12a70 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73  ble->nCol;.  tes
12a80 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
12a90 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
12aa0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
12ab0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b  ->nCol==BMS-2 );
12ac0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
12ad0 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
12ae0 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
12af0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
12b00 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b  <i) ) nColumn++;
12b10 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
12b20 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69  >colUsed & (((Bi
12b30 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
12b40 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  )) ){.    nColum
12b50 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  n += pTable->nCo
12b60 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d  l - BMS + 1;.  }
12b70 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  .  pLevel->plan.
12b80 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
12b90 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45  _COLUMN_EQ | WHE
12ba0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f  RE_IDX_ONLY | WO
12bb0 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  _EQ;..  /* Const
12bc0 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
12bd0 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
12be0 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
12bf0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
12c00 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65  (Index);.  nByte
12c10 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
12c20 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20  of(int);     /* 
12c30 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a  Index.aiColumn *
12c40 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f  /.  nByte += nCo
12c50 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  lumn*sizeof(char
12c60 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  *);   /* Index.a
12c70 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65  zColl */.  nByte
12c80 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20   += nColumn;    
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ca0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
12cb0 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
12cc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
12cd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79  (pParse->db, nBy
12ce0 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  te);.  if( pIdx=
12cf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
12d00 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
12d10 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64  dx = pIdx;.  pId
12d20 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
12d30 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20  r**)&pIdx[1];.  
12d40 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
12d50 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a   (int*)&pIdx->az
12d60 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  Coll[nColumn];. 
12d70 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
12d80 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e  r = (u8*)&pIdx->
12d90 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e  aiColumn[nColumn
12da0 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  ];.  pIdx->zName
12db0 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b   = "auto-index";
12dc0 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
12dd0 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49   = nColumn;.  pI
12de0 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  dx->pTable = pTa
12df0 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  ble;.  n = 0;.  
12e00 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
12e10 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
12e20 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
12e30 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12e40 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
12e50 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
12e60 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
12e70 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
12e80 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
12e90 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
12ea0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
12eb0 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
12ec0 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
12ed0 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
12ee0 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43  .      if( (idxC
12ef0 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20  ols & cMask)==0 
12f00 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
12f10 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
12f20 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43  pr;.        idxC
12f30 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20  ols |= cMask;.  
12f40 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
12f50 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d  lumn[n] = pTerm-
12f60 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
12f70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
12f80 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
12f90 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
12fa0 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
12fb0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
12fc0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
12fd0 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c  n] = ALWAYS(pCol
12fe0 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  l) ? pColl->zNam
12ff0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
13000 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
13010 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
13020 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
13030 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20  Level->plan.nEq 
13040 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
13050 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
13060 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
13070 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
13080 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
13090 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
130a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
130b0 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
130c0 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
130d0 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  & (((Bitmask)1)<
130e0 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64  <i) ){.      pId
130f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13100 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
13110 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
13120 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
13130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13140 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
13150 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
13160 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
13170 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70  for(i=BMS-1; i<p
13180 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
13190 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
131a0 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a  iColumn[n] = i;.
131b0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
131c0 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
131d0 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
131e0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
131f0 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a   n==nColumn );..
13200 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13210 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
13220 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20  */.  pKeyinfo = 
13230 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
13240 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
13250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
13260 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
13270 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13280 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
13290 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76  nAutoindex, pLev
132a0 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f  el->iIdxCur, nCo
132b0 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20  lumn+1, 0,.     
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
132d0 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20  char*)pKeyinfo, 
132e0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
132f0 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  FF);.  VdbeComme
13300 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
13310 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29   pTable->zName))
13320 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  ;..  /* Fill the
13330 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13340 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f   with content */
13350 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
13360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13370 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65  , OP_Rewind, pLe
13380 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
13390 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
133a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
133b0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
133c0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
133d0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20  y(pParse, pIdx, 
133e0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
133f0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
13400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13410 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
13420 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
13430 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
13440 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13450 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
13460 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
13470 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
13490 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
134a0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
134b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
134c0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
134d0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
134e0 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
134f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13500 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
13510 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13520 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13530 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
13540 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
13550 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
13560 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
13570 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13580 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
13590 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
135a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
135b0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
135c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
135d0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
135e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
135f0 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
13600 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13610 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
13620 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
13630 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13640 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13650 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
13660 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
13670 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
13680 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
13690 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
136a0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
136b0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
136c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
136d0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
136e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
136f0 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20   .  WhereClause 
13700 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53  *pWC,.  struct S
13710 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13720 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
13730 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74  OrderBy.){.  int
13740 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
13750 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  rm;.  struct sql
13760 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13770 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
13780 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
13790 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
137a0 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
137b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
137c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
137d0 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
137e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
137f0 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  m;.  int nOrderB
13800 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  y;.  sqlite3_ind
13810 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
13820 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  o;..  WHERETRACE
13830 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
13840 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
13850 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  ...\n", pSrc->pT
13860 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  ab->zName));..  
13870 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
13880 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
13890 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
138a0 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
138b0 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
138c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
138d0 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
138e0 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
138f0 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
13900 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
13910 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
13920 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
13930 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
13940 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
13950 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
13960 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  r&(pTerm->eOpera
13970 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  tor-1))==0 );.  
13980 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
13990 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
139a0 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
139b0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
139c0 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
139d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
139e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
139f0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IN|WO_ISNULL)
13a00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13a10 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20   nTerm++;.  }.. 
13a20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
13a30 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
13a40 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
13a50 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13a60 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
13a70 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ble then allocat
13a80 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
13a90 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66  aOrderBy part of
13aa0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
13ab0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13ac0 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e  ucture..  */.  n
13ad0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69  OrderBy = 0;.  i
13ae0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
13b00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
13b10 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
13b20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
13b30 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
13b40 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
13b50 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
13b60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
13b70 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
13b80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13b90 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79   if( i==pOrderBy
13ba0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
13bb0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
13bc0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
13bd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
13be0 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
13bf0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
13c00 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49  ucture.  */.  pI
13c10 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  dxInfo = sqlite3
13c20 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
13c30 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
13c40 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20  *pIdxInfo).     
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
13c70 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
13c80 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
13c90 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
13cb0 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
13cc0 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
13cd0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
13ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13cf0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d00 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  e, "out of memor
13d10 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75  y");.    /* (dou
13d20 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
13d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13d40 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
13d50 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
13d60 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
13d70 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75  lize the structu
13d80 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  re.  The sqlite3
13d90 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13da0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20  cture contains. 
13db0 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
13dc0 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
13dd0 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
13de0 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
13df0 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69  from.  ** changi
13e00 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
13e10 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
13e20 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
13e30 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  der to.  ** init
13e40 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
13e50 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  lds..  */.  pIdx
13e60 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73  Cons = (struct s
13e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13e80 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e  straint*)&pIdxIn
13e90 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64  fo[1];.  pIdxOrd
13ea0 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
13eb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
13ec0 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
13ed0 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65  nTerm];.  pUsage
13ee0 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
13ef0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13f00 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78  int_usage*)&pIdx
13f10 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79  OrderBy[nOrderBy
13f20 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  ];.  *(int*)&pId
13f30 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13f40 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28  nt = nTerm;.  *(
13f50 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
13f60 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
13f70 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
13f80 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
13f90 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
13fa0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
13fb0 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
13fc0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
13fd0 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
13fe0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
13ff0 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
14000 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
14010 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14020 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
14030 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
14040 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28   pUsage;..  for(
140a0 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
140b0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
140c0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
140d0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
140e0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
140f0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
14100 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14110 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
14120 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
14130 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
14140 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14150 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14160 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
14170 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
14180 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
14190 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
141a0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
141b0 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
141c0 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
141d0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
141e0 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
141f0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
14200 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14210 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
14220 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
14230 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d  ].op = (u8)pTerm
14240 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20  ->eOperator;.   
14250 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
14260 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
14270 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
14280 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
14290 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
142a0 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
142b0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
142c0 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
142d0 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
142e0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
142f0 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
14300 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
14310 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
14320 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14330 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
14340 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
14350 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14360 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
14370 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
14380 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14390 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
143a0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
143b0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
143c0 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
143d0 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
143e0 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
143f0 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
14400 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14410 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
14420 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
14430 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
14440 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
14450 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
14460 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
14470 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
14480 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a  );.    j++;.  }.
14490 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
144a0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
144b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
144c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
144d0 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  xpr;.    pIdxOrd
144e0 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
144f0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
14500 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
14510 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64  y[i].desc = pOrd
14520 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
14530 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  rder;.  }..  ret
14540 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a  urn pIdxInfo;.}.
14550 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  ./*.** The table
14560 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
14570 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
14580 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
14590 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
145a0 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65  .** must represe
145b0 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  nt a virtual tab
145c0 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
145d0 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42  n invokes the xB
145e0 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65  estIndex().** me
145f0 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
14600 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74  ual table with t
14610 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14620 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61  _info pointer pa
14630 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61  ssed.** as the a
14640 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
14650 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14660 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70  s, pParse is pop
14670 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65  ulated with an e
14680 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
14690 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76   a.** non-zero v
146a0 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
146b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
146c0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
146d0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72  he output.** par
146e0 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  t of the sqlite3
146f0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
14700 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f  cture is left po
14710 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  pulated..**.** W
14720 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e  hether or not an
14730 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
14740 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ed, it is the re
14750 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14760 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
14770 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
14780 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d   p->idxStr if p-
14790 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
147a0 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74  r indicates.** t
147b0 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75  hat this is requ
147c0 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
147d0 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65  int vtabBestInde
147e0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
147f0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71   Table *pTab, sq
14800 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14810 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
14820 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
14830 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
14840 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
14850 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69  ->pVtab;.  int i
14860 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57  ;.  int rc;..  W
14870 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73  HERETRACE(("xBes
14880 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22  tIndex for %s\n"
14890 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
148a0 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
148b0 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
148c0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
148d0 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
148e0 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
148f0 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
14900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14910 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
14920 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
14930 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14940 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14950 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
14960 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
14970 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
14980 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14990 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
149a0 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
149b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
149c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
149d0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
149e0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
149f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14a00 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
14a10 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
14a20 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
14a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14a40 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
14a50 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
14a60 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
14a70 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
14a80 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
14a90 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
14aa0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14ab0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
14ac0 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
14ad0 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
14ae0 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
14af0 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
14b00 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
14b10 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
14b20 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nErr;.}.../*.**
14b30 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73   Compute the bes
14b40 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69  t index for a vi
14b50 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
14b60 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  ** The best inde
14b70 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79  x is computed by
14b80 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
14b90 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
14ba0 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d  rtual.** table m
14bb0 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  odule.  This rou
14bc0 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a  tine is really j
14bd0 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68  ust a wrapper th
14be0 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68  at sets up.** th
14bf0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14c00 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
14c10 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  hat is used to c
14c20 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a  ommunicate with.
14c30 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  ** xBestIndex..*
14c40 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20  *.** In a join, 
14c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
14c60 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c  ht be called mul
14c70 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20  tiple times for 
14c80 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74  the.** same virt
14c90 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
14ca0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14cb0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
14cc0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69  created.** and i
14cd0 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68  nitialized on th
14ce0 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
14cf0 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  on and reused on
14d00 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
14d10 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20  ** invocations. 
14d20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14d30 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14d40 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
14d50 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  hen.** code is g
14d60 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65  enerated to acce
14d70 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ss the virtual t
14d80 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65  able.  The where
14d90 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a  InfoDelete() .**
14da0 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63   routine takes c
14db0 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74  are of freeing t
14dc0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
14dd0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
14de0 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f  after.** everybo
14df0 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  dy has finished 
14e00 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  with it..*/.stat
14e10 69 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74  ic void bestVirt
14e20 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ualIndex(.  Pars
14e30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14e50 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14e60 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
14e70 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
14e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
14e90 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
14ea0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14eb0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
14ec0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
14ed0 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
14ee0 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
14ef0 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
14f00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
14f10 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61  of cursors not a
14f20 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64  vailable for ind
14f30 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ex */.  Bitmask 
14f40 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
14f50 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14f60 72 73 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72  rs not valid for
14f70 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
14f80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
14f90 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
14fa0 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62    /* The order b
14fb0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  y clause */.  Wh
14fc0 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20  ereCost *pCost, 
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fe0 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
14ff0 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c  ry plan */.  sql
15000 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15010 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20  **ppIdxInfo  /* 
15020 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f  Index informatio
15030 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65 73  n passed to xBes
15040 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54  tIndex */.){.  T
15050 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72  able *pTab = pSr
15060 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  c->pTab;.  sqlit
15070 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
15080 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63  IdxInfo;.  struc
15090 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
150a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
150b0 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
150c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
150d0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
150e0 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
150f0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
15100 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72   i, j;.  int nOr
15110 64 65 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20  derBy;.  double 
15120 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  rCost;..  /* Mak
15130 65 20 73 75 72 65 20 77 73 46 6c 61 67 73 20 69  e sure wsFlags i
15140 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
15150 20 73 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65   some sane value
15160 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
15170 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63  the .  ** malloc
15180 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65   in allocateInde
15190 78 49 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e  xInfo() fails an
151a0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
151b0 72 65 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a  returns leaving.
151c0 20 20 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20    ** wsFlags in 
151d0 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
151e0 20 73 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c   state, the call
151f0 65 72 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e  er may behave un
15200 70 72 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a  predictably..  *
15210 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74  /.  memset(pCost
15220 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
15230 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  st));.  pCost->p
15240 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
15250 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
15260 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
15270 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
15280 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  o structure has 
15290 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
152a0 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  sly.  ** allocat
152b0 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ed and initializ
152c0 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  ed, then allocat
152d0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
152e0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
152f0 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64  pIdxInfo = *ppId
15300 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
15310 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
15320 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64  *ppIdxInfo = pId
15330 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
15340 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
15350 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 4f 72  , pWC, pSrc, pOr
15360 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66  derBy);.  }.  if
15370 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
15380 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15390 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
153a0 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  oint, the sqlite
153b0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
153c0 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78  ucture that pIdx
153d0 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  Info points.  **
153e0 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65   to will have be
153f0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  en initialized, 
15400 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68  either during th
15410 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
15420 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72  tion or.  ** dur
15430 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69  ing some prior i
15440 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20  nvocation.  Now 
15450 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  we just have to 
15460 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20  customize the.  
15470 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49  ** details of pI
15480 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63  dxInfo for the c
15490 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
154a0 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f  n and pass it to
154b0 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  .  ** xBestIndex
154c0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ..  */..  /* The
154d0 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73   module name mus
154e0 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c  t be defined. Al
154f0 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e  so, by this poin
15500 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a  t there must.  *
15510 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  * be a pointer t
15520 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
15530 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  b structure. Oth
15540 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69  erwise.  ** sqli
15550 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
15560 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61  Names() would ha
15570 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65  ve picked up the
15580 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20   error. .  */.  
15590 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a  assert( pTab->az
155a0 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61  ModuleArg && pTa
155b0 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
155c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ] );.  assert( s
155d0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
155e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
155f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ) );..  /* Set t
15600 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  he aConstraint[]
15610 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61  .usable fields a
15620 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
15630 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76  l .  ** output v
15640 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f  ariables to zero
15650 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e  ..  **.  ** aCon
15660 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
15670 20 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e   is true for con
15680 73 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74  straints where t
15690 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20  he right-hand.  
156a0 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73  ** side contains
156b0 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73   only references
156c0 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68   to tables to th
156d0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75  e left of the cu
156e0 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65  rrent.  ** table
156f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15700 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72  s, if the constr
15710 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
15720 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
15730 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
15740 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a  = expr.  **.  **
15750 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c   and we are eval
15760 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74  uating a join, t
15770 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
15780 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20  nt on column is 
15790 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64  .  ** only valid
157a0 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72   if all tables r
157b0 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70  eferenced in exp
157c0 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c  r occur to the l
157d0 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  eft.  ** of the 
157e0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
157f0 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20   column..  **.  
15800 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69  ** The aConstrai
15810 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  nts[] array cont
15820 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
15830 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
15840 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  .  ** on the cur
15850 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61  rent table.  Tha
15860 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61  t way we only ha
15870 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74  ve to compute it
15880 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20   once.  ** even 
15890 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20  though we might 
158a0 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20  try to pick the 
158b0 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69  best index multi
158c0 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20  ple times..  ** 
158d0 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74  For each attempt
158e0 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69   at picking an i
158f0 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20  ndex, the order 
15900 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
15910 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74  .  ** join might
15920 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f   be different so
15930 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f   we have to reco
15940 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65  mpute the usable
15950 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20   flag.  ** each 
15960 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  time..  */.  pId
15970 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
15980 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
15990 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
159a0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
159b0 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70  nt;.  pUsage = p
159c0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
159d0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72  aintUsage;.  for
159e0 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
159f0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15a00 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
15a10 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e  .    j = pIdxCon
15a20 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
15a30 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
15a40 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78  ->a[j];.    pIdx
15a50 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
15a60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15a70 68 74 26 6e 6f 74 52 65 61 64 79 29 20 3f 20 30  ht&notReady) ? 0
15a80 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   : 1;.  }.  mems
15a90 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69  et(pUsage, 0, si
15aa0 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a  zeof(pUsage[0])*
15ab0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
15ac0 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49  raint);.  if( pI
15ad0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
15ae0 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
15af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
15b00 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
15b10 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e    }.  pIdxInfo->
15b20 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  idxStr = 0;.  pI
15b30 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
15b40 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
15b50 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
15b60 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
15b70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
15b80 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f  d = 0;.  /* ((do
15b90 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20  uble)2) In case 
15ba0 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
15bb0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
15bc0 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   */.  pIdxInfo->
15bd0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
15be0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
15bf0 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20   ((double)2);.  
15c00 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 49  nOrderBy = pIdxI
15c10 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20  nfo->nOrderBy;. 
15c20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 29   if( !pOrderBy )
15c30 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
15c40 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
15c50 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73  }..  if( vtabBes
15c60 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
15c70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29  Tab, pIdxInfo) )
15c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
15c90 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  }..  pIdxCons = 
15ca0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
15cb0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
15cc0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
15cd0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
15ce0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
15cf0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
15d00 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55  i++){.    if( pU
15d10 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
15d20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  x>0 ){.      pCo
15d30 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d  st->used |= pWC-
15d40 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69  >a[pIdxCons[i].i
15d50 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72  TermOffset].prer
15d60 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  eqRight;.    }. 
15d70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
15d80 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
15d90 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
15da0 20 73 65 6c 65 63 74 65 64 20 76 69 72 74 75 61   selected virtua
15db0 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20  l table index.  
15dc0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  ** does not sati
15dd0 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65  sfy it, increase
15de0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
15df0 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c   scan accordingl
15e00 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74  y. This.  ** mat
15e10 63 68 65 73 20 74 68 65 20 70 72 6f 63 65 73 73  ches the process
15e20 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74  ing for non-virt
15e30 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65  ual tables in be
15e40 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a  stBtreeIndex()..
15e50 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70    */.  rCost = p
15e60 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
15e70 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f  edCost;.  if( pO
15e80 72 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e  rderBy && pIdxIn
15e90 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
15ea0 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43  med==0 ){.    rC
15eb0 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43  ost += estLog(rC
15ec0 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a  ost)*rCost;.  }.
15ed0 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69  .  /* The cost i
15ee0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
15ef0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
15f00 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
15f10 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20  the.  ** inital 
15f20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43  value of lowestC
15f30 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70  ost in this loop
15f40 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  . If it is, then
15f50 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c   the.  ** (cost<
15f60 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
15f70 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
15f80 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20  r be true..  ** 
15f90 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62  .  ** Use "(doub
15fa0 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66  le)2" instead of
15fb0 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f   "2.0" in case O
15fc0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15fd0 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69  NT .  ** is defi
15fe0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
15ff0 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f  (SQLITE_BIG_DBL/
16000 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f  ((double)2))<rCo
16010 73 74 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  st ){.    pCost-
16020 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45  >rCost = (SQLITE
16030 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
16040 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e)2));.  }else{.
16050 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
16060 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20   = rCost;.  }.  
16070 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56  pCost->plan.u.pV
16080 74 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66  tabIdx = pIdxInf
16090 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  o;.  if( pIdxInf
160a0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
160b0 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  ed ){.    pCost-
160c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
160d0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
160e0 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61    }.  pCost->pla
160f0 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64  n.nEq = 0;.  pId
16100 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
16110 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = nOrderBy;..  /
16120 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
16130 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 61  more efficient a
16140 63 63 65 73 73 20 70 61 74 74 65 72 6e 20 62 79  ccess pattern by
16150 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   using multiple 
16160 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20  indexes.  ** to 
16170 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65  optimize an OR e
16180 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
16190 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
161a0 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f  e. .  */.  bestO
161b0 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61  rClauseIndex(pPa
161c0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
161d0 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c  notReady, notVal
161e0 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  id, pOrderBy, pC
161f0 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ost);.}.#endif /
16200 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
16210 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
16220 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
16230 64 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  dx is a pointer 
16240 74 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  to an index stru
16250 63 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61  cture that has a
16260 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51  n array of.** SQ
16270 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
16280 45 53 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64  ES evenly spaced
16290 20 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20   samples of the 
162a0 66 69 72 73 74 20 69 6e 64 65 78 65 64 20 63 6f  first indexed co
162b0 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69  lumn.** stored i
162c0 6e 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e  n Index.aSample.
162d0 20 54 68 65 73 65 20 73 61 6d 70 6c 65 73 20 64   These samples d
162e0 69 76 69 64 65 20 74 68 65 20 64 6f 6d 61 69 6e  ivide the domain
162f0 20 6f 66 20 76 61 6c 75 65 73 20 73 74 6f 72 65   of values store
16300 64 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69  d.** the index i
16310 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e 44 45  nto (SQLITE_INDE
16320 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72 65 67  X_SAMPLES+1) reg
16330 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20  ions..** Region 
16340 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76  0 contains all v
16350 61 6c 75 65 73 20 6c 65 73 73 20 74 68 61 6e 20  alues less than 
16360 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
16370 20 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a   value. Region.*
16380 2a 20 31 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  * 1 contains val
16390 75 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ues between the 
163a0 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64  first and second
163b0 20 73 61 6d 70 6c 65 73 2e 20 20 52 65 67 69 6f   samples.  Regio
163c0 6e 20 32 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  n 2 contains.** 
163d0 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 73  values between s
163e0 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 2e 20  amples 2 and 3. 
163f0 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20 52 65 67   And so on.  Reg
16400 69 6f 6e 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ion SQLITE_INDEX
16410 5f 53 41 4d 50 4c 45 53 0a 2a 2a 20 63 6f 6e 74  _SAMPLES.** cont
16420 61 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67  ains values larg
16430 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74  er than the last
16440 20 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   sample..**.** I
16450 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 74  f the index cont
16460 61 69 6e 73 20 6d 61 6e 79 20 64 75 70 6c 69 63  ains many duplic
16470 61 74 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ates of a single
16480 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 69 74 20   value, then it 
16490 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
164a0 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hat two or more 
164b0 61 64 6a 61 63 65 6e 74 20 73 61 6d 70 6c 65 73  adjacent samples
164c0 20 63 61 6e 20 68 6f 6c 64 20 74 68 65 20 73 61   can hold the sa
164d0 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 68 65  me value..** Whe
164e0 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  n that is the ca
164f0 73 65 2c 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  se, the smallest
16500 20 70 6f 73 73 69 62 6c 65 20 72 65 67 69 6f 6e   possible region
16510 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
16520 64 0a 2a 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55  d.** when roundU
16530 70 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 74  p is false and t
16540 68 65 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69  he largest possi
16550 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f 64 65 20  ble region code 
16560 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77  is returned.** w
16570 68 65 6e 20 72 6f 75 6e 64 55 70 20 69 73 20 74  hen roundUp is t
16580 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  rue..**.** If su
16590 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
165a0 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
165b0 65 73 20 77 68 69 63 68 20 6f 66 20 74 68 65 20  es which of the 
165c0 72 65 67 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a  regions value .*
165d0 2a 20 70 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20  * pVal lies in, 
165e0 73 65 74 73 20 2a 70 69 52 65 67 69 6f 6e 20 74  sets *piRegion t
165f0 6f 20 74 68 65 20 72 65 67 69 6f 6e 20 69 6e 64  o the region ind
16600 65 78 20 28 61 20 76 61 6c 75 65 20 62 65 74 77  ex (a value betw
16610 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c  een 0.** and SQL
16620 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
16630 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65 29 20  S+1, inclusive) 
16640 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
16650 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
16660 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77   an OOM occurs w
16670 68 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e 67 20  hile converting 
16680 74 65 78 74 20 76 61 6c 75 65 73 20 62 65 74 77  text values betw
16690 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a  een encodings,.*
166a0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
166b0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
166c0 70 69 52 65 67 69 6f 6e 20 69 73 20 75 6e 64 65  piRegion is unde
166d0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
166e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
166f0 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT2.static int 
16700 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
16710 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16720 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16730 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
16740 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  ection */.  Inde
16750 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
16760 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16770 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d   to consider dom
16780 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69  ain of */.  sqli
16790 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c  te3_value *pVal,
167a0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
167b0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
167c0 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167e0 20 52 65 74 75 72 6e 20 6c 61 72 67 65 73 74 20   Return largest 
167f0 76 61 6c 69 64 20 72 65 67 69 6f 6e 20 69 66 20  valid region if 
16800 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  true */.  int *p
16810 69 52 65 67 69 6f 6e 20 20 20 20 20 20 20 20 20  iRegion         
16820 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
16830 67 69 6f 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69  gion of domain i
16840 6e 20 77 68 69 63 68 20 76 61 6c 75 65 20 6c 69  n which value li
16850 65 73 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  es */.){.  asser
16860 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c  t( roundUp==0 ||
16870 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20   roundUp==1 );. 
16880 20 69 66 28 20 41 4c 57 41 59 53 28 70 56 61 6c   if( ALWAYS(pVal
16890 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61  ) ){.    IndexSa
168a0 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
168b0 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
168c0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
168d0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
168e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
168f0 28 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28  (pVal);..    if(
16900 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
16910 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d  NTEGER || eType=
16920 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
16930 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
16940 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
16950 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20  double(pVal);.  
16960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
16970 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16980 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
16990 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
169a0 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
169b0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
169c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
169d0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
169e0 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65  QLITE_TEXT ) bre
169f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
16a00 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
16a10 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16a20 5b 69 5d 2e 75 2e 72 3e 72 20 29 20 62 72 65 61  [i].u.r>r ) brea
16a30 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
16a40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16a50 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d  aSample[i].u.r>=
16a60 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
16a70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16a80 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65   }else if( eType
16a90 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
16aa0 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
16ab0 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20      if( roundUp 
16ac0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
16ad0 28 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58  ( i<SQLITE_INDEX
16ae0 5f 53 41 4d 50 4c 45 53 20 26 26 20 61 53 61 6d  _SAMPLES && aSam
16af0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16b00 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b  LITE_NULL ) i++;
16b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16b20 73 65 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74  se{ .      sqlit
16b30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16b40 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
16b50 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
16b60 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
16b70 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
16b80 20 20 2f 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20    /* pVal comes 
16b90 66 72 6f 6d 20 73 71 6c 69 74 65 33 56 61 6c 75  from sqlite3Valu
16ba0 65 46 72 6f 6d 45 78 70 72 28 29 20 73 6f 20 74  eFromExpr() so t
16bb0 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62  he type cannot b
16bc0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  e NULL */.      
16bd0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
16be0 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54  QLITE_TEXT || eT
16bf0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16c00 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 65   );..      if( e
16c10 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
16c20 42 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d  B ){.        z =
16c30 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
16c40 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
16c50 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70  pVal);.        p
16c60 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
16c70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  Coll;.        as
16c80 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63  sert( pColl->enc
16c90 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
16ca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16cb0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
16cc0 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
16cd0 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
16ce0 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c   0, *pIdx->azCol
16cf0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
16d00 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
16d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16d20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
16d30 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
16d40 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a   sequence: %s",.
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d            *pIdx-
16d70 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  >azColl);.      
16d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d90 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
16da0 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28   }.        z = (
16db0 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
16dc0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
16dd0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
16de0 20 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b         if( !z ){
16df0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16e00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16e20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70    assert( z && p
16e30 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
16e40 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cmp );.      }. 
16e50 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
16e60 56 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c  ValueBytes(pVal,
16e70 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20   pColl->enc);.. 
16e80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16e90 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
16ea0 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  PLES; i++){.    
16eb0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
16ec0 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79     int eSamplety
16ed0 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  pe = aSample[i].
16ee0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69  eType;.        i
16ef0 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d  f( eSampletype==
16f00 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65  SQLITE_NULL || e
16f10 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65  Sampletype<eType
16f20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16f30 20 20 20 20 20 69 66 28 20 28 65 53 61 6d 70 6c       if( (eSampl
16f40 65 74 79 70 65 21 3d 65 54 79 70 65 29 20 29 20  etype!=eType) ) 
16f50 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53  break;.#ifndef S
16f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
16f80 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f  ll->enc!=SQLITE_
16f90 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20  UTF8 ){.        
16fa0 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20    int nSample;. 
16fb0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
16fc0 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
16fd0 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20  Utf8to16(.      
16fe0 20 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c          db, pCol
16ff0 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b  l->enc, aSample[
17000 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b  i].u.z, aSample[
17010 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70  i].nByte, &nSamp
17020 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  le.          );.
17030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
17040 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
17050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
17060 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
17080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17090 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
170a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
170b0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
170c0 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20  pUser, nSample, 
170d0 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a  zSample, n, z);.
170e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
170f0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d  3DbFree(db, zSam
17100 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ple);.        }e
17110 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
17120 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63     {.          c
17130 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
17140 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61  Coll->pUser, aSa
17150 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61  mple[i].nByte, a
17160 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e  Sample[i].u.z, n
17170 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , z);.        }.
17180 20 20 20 20 20 20 20 20 69 66 28 20 63 2d 72 6f          if( c-ro
17190 75 6e 64 55 70 3e 3d 30 20 29 20 62 72 65 61 6b  undUp>=0 ) break
171a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
171b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
171c0 30 20 26 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49  0 && i<=SQLITE_I
171d0 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
171e0 20 20 20 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20      *piRegion = 
171f0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
17200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
17210 64 69 66 20 20 20 2f 2a 20 23 69 66 64 65 66 20  dif   /* #ifdef 
17220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17230 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  AT2 */../*.** If
17240 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
17250 72 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c  r represents a l
17260 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65  iteral value, se
17270 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
17280 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f  o.** an sqlite3_
17290 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
172a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
172b0 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20  ame value, with 
172c0 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20  affinity.** aff 
172d0 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62  applied to it, b
172e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
172f0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17300 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
17310 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65   .** caller to e
17320 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
17330 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
17340 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74   by passing it t
17350 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c  o .** sqlite3Val
17360 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ueFree()..**.** 
17370 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
17380 61 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70  arse is a recomp
17390 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72  ile (sqlite3Repr
173a0 65 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78  epare()) and pEx
173b0 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20  pr.** is an SQL 
173c0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75  variable that cu
173d0 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f  rrently has a no
173e0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75  n-NULL value bou
173f0 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65  nd to it,.** cre
17400 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ate an sqlite3_v
17410 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
17420 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76  ontaining this v
17430 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68  alue, again with
17440 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66  .** affinity aff
17450 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20   applied to it, 
17460 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
17470 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65  f neither of the
17480 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65   above apply, se
17490 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t *pp to NULL..*
174a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
174b0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
174c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
174d0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
174e0 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  _OK..*/.#ifdef S
174f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17500 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61  T2.static int va
17510 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50  lueFromExpr(.  P
17520 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
17530 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20   Expr *pExpr, . 
17540 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69   u8 aff, .  sqli
17550 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29  te3_value **pp.)
17560 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
17570 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20  p==TK_VARIABLE. 
17580 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
17590 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
175a0 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
175b0 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
175c0 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78    int iVar = pEx
175d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
175e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
175f0 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
17600 56 64 62 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20  Vdbe, iVar); /* 
17610 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37  IMP: R-23257-027
17620 37 38 20 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20  78 */.    *pp = 
17630 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
17640 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70  lue(pParse->pRep
17650 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66  repare, iVar, af
17660 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  f);.    return S
17670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17680 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61  return sqlite3Va
17690 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
176a0 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
176b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c  QLITE_UTF8, aff,
176c0 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   pp);.}.#endif..
176d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
176e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65  ion is used to e
176f0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
17700 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
17710 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a  will be visited.
17720 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61  ** by scanning a
17730 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61  n index for a ra
17740 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54  nge of values. T
17750 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76  he range may hav
17760 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f  e an upper.** bo
17770 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75  und, a lower bou
17780 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65  nd, or both. The
17790 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
177a0 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65  rms that set the
177b0 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f   upper.** and lo
177c0 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72  wer bounds are r
177d0 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c  epresented by pL
177e0 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
177f0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f  respectively. Fo
17800 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73  r.** example, as
17810 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65  suming that inde
17820 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a  x p is on t1(a):
17830 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
17840 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
17850 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
17860 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17870 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c       |_____|   |
17880 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20  _____|.**       
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20  |         |.**  
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70     pLower    pUp
178d0 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  per.**.** If eit
178e0 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72  her of the upper
178f0 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
17900 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
17910 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73  then NULL is pas
17920 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20  sed in.** place 
17930 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
17940 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a  ding WhereTerm..
17950 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61  **.** The nEq pa
17960 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
17970 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
17980 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
17990 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a  subject to the.*
179a0 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  * range constrai
179b0 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
179c0 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
179d0 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   of equality con
179e0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69  straints.** opti
179f0 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
17a00 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
17a10 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  . For example, a
17a20 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
17a30 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62  is.** on t1(a, b
17a40 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
17a50 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
17a60 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
17a70 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
17a80 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
17a90 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
17aa0 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
17ab0 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61 73   the value 1 (as
17ac0 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
17ad0 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a  icted column,.**
17ae0 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
17af0 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  d left-most colu
17b00 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
17b10 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
17b20 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
17b30 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
17b40 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
17b50 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
17b60 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
17b70 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  ssed 0..**.** Th
17b80 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
17b90 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 62   is an integer b
17ba0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 31 30 30  etween 1 and 100
17bb0 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 41 20 72  , inclusive. A r
17bc0 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f  eturn.** value o
17bd0 66 20 31 20 69 6e 64 69 63 61 74 65 73 20 74 68  f 1 indicates th
17be0 61 74 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  at the proposed 
17bf0 72 61 6e 67 65 20 73 63 61 6e 20 69 73 20 65 78  range scan is ex
17c00 70 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 0a  pected to visit.
17c10 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  ** approximately
17c20 20 31 2f 31 30 30 74 68 20 28 31 25 29 20 6f 66   1/100th (1%) of
17c30 20 74 68 65 20 72 6f 77 73 20 73 65 6c 65 63 74   the rows select
17c40 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 65 71  ed by the nEq eq
17c50 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72  uality.** constr
17c60 61 69 6e 74 73 20 28 69 66 20 61 6e 79 29 2e 20  aints (if any). 
17c70 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  A return value o
17c80 66 20 31 30 30 20 69 6e 64 69 63 61 74 65 73 20  f 100 indicates 
17c90 74 68 61 74 20 69 74 20 69 73 20 65 78 70 65 63  that it is expec
17ca0 74 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ted.** that the 
17cb0 72 61 6e 67 65 20 73 63 61 6e 20 77 69 6c 6c 20  range scan will 
17cc0 76 69 73 69 74 20 65 76 65 72 79 20 72 6f 77 20  visit every row 
17cd0 28 31 30 30 25 29 20 73 65 6c 65 63 74 65 64 20  (100%) selected 
17ce0 62 79 20 74 68 65 20 65 71 75 61 6c 69 74 79 0a  by the equality.
17cf0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ** constraints..
17d00 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73  **.** In the abs
17d10 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73  ence of sqlite_s
17d20 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74  tat2 ANALYZE dat
17d30 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e  a, each range in
17d40 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75  equality.** redu
17d50 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
17d60 70 61 63 65 20 62 79 20 33 2f 34 74 68 73 2e 20  pace by 3/4ths. 
17d70 20 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20   Hence a single 
17d80 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29  constraint (x>?)
17d90 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61  .** results in a
17da0 20 72 65 74 75 72 6e 20 6f 66 20 32 35 20 61 6e   return of 25 an
17db0 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  d a range constr
17dc0 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c  aint (x>? AND x<
17dd0 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  ?) results.** in
17de0 20 61 20 72 65 74 75 72 6e 20 6f 66 20 36 2e 0a   a return of 6..
17df0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
17e00 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
17e10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17e20 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17e30 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17e40 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17e50 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
17e60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
17e70 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  dex containing t
17e80 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
17e90 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f  d column; "x" */
17ea0 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20  .  int nEq,     
17eb0 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78          /* index
17ec0 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20   into p->aCol[] 
17ed0 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  of the range-com
17ee0 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  pared column */.
17ef0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
17f00 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
17f10 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
17f20 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
17f30 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
17f40 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
17f50 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
17f60 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
17f70 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
17f80 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
17f90 2f 0a 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20  /.  int *piEst  
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
17fb0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
17fc0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
17fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
17fe0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17ff0 53 54 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71  STAT2..  if( nEq
18000 3d 3d 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c  ==0 && p->aSampl
18010 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
18020 5f 76 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61  _value *pLowerVa
18030 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
18040 65 33 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72  e3_value *pUpper
18050 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Val = 0;.    int
18060 20 69 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iEst;.    int i
18070 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  Lower = 0;.    i
18080 6e 74 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49  nt iUpper = SQLI
18090 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
180a0 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55  ;.    int roundU
180b0 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
180c0 69 6e 74 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72  int roundUpLower
180d0 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 61 66 66   = 0;.    u8 aff
180e0 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
180f0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
18100 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20  ]].affinity;..  
18110 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
18120 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18130 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
18140 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
18150 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
18160 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
18170 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65 72 56  r, aff, &pLowerV
18180 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
18190 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  t( pLower->eOper
181a0 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70  ator==WO_GT || p
181b0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
181c0 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==WO_GE );.     
181d0 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 20 3d 20   roundUpLower = 
181e0 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74  (pLower->eOperat
181f0 6f 72 3d 3d 57 4f 5f 47 54 29 20 3f 31 3a 30 3b  or==WO_GT) ?1:0;
18200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18220 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  pUpper ){.      
18230 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
18240 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
18250 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
18260 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
18270 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
18280 2c 20 26 70 55 70 70 65 72 56 61 6c 29 3b 0a 20  , &pUpperVal);. 
18290 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70       assert( pUp
182a0 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
182b0 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65 72 2d  WO_LT || pUpper-
182c0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
182d0 45 20 29 3b 0a 20 20 20 20 20 20 72 6f 75 6e 64  E );.      round
182e0 55 70 55 70 70 65 72 20 3d 20 28 70 55 70 70 65  UpUpper = (pUppe
182f0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
18300 5f 4c 45 29 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  _LE) ?1:0;.    }
18310 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
18320 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c 6f 77  LITE_OK || (pLow
18330 65 72 56 61 6c 3d 3d 30 20 26 26 20 70 55 70 70  erVal==0 && pUpp
18340 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20 20 20  erVal==0) ){.   
18350 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
18360 72 65 65 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a  ree(pLowerVal);.
18370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
18380 75 65 46 72 65 65 28 70 55 70 70 65 72 56 61 6c  ueFree(pUpperVal
18390 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 61  );.      goto ra
183a0 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b  nge_est_fallback
183b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
183c0 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29 7b 0a  pLowerVal==0 ){.
183d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
183e0 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
183f0 73 65 2c 20 70 2c 20 70 55 70 70 65 72 56 61 6c  se, p, pUpperVal
18400 2c 20 72 6f 75 6e 64 55 70 55 70 70 65 72 2c 20  , roundUpUpper, 
18410 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20  &iUpper);.      
18420 69 66 28 20 70 4c 6f 77 65 72 20 29 20 69 4c 6f  if( pLower ) iLo
18430 77 65 72 20 3d 20 69 55 70 70 65 72 2f 32 3b 0a  wer = iUpper/2;.
18440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55      }else if( pU
18450 70 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  pperVal==0 ){.  
18460 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
18470 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65  ngeRegion(pParse
18480 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20  , p, pLowerVal, 
18490 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26 69  roundUpLower, &i
184a0 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Lower);.      if
184b0 28 20 70 55 70 70 65 72 20 29 20 69 55 70 70 65  ( pUpper ) iUppe
184c0 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20 53 51  r = (iLower + SQ
184d0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
184e0 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d  ES + 1)/2;.    }
184f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
18500 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
18510 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70  n(pParse, p, pUp
18520 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55  perVal, roundUpU
18530 70 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a  pper, &iUpper);.
18540 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18560 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
18570 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
18580 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 72   p, pLowerVal, r
18590 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26 69 4c  oundUpLower, &iL
185a0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ower);.      }. 
185b0 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52     }.    WHERETR
185c0 41 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e  ACE(("range scan
185d0 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64   regions: %d..%d
185e0 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70  \n", iLower, iUp
185f0 70 65 72 29 29 3b 0a 0a 20 20 20 20 69 45 73 74  per));..    iEst
18600 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
18610 65 72 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  er;.    testcase
18620 28 20 69 45 73 74 3d 3d 53 51 4c 49 54 45 5f 49  ( iEst==SQLITE_I
18630 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
18640 20 20 20 20 61 73 73 65 72 74 28 20 69 45 73 74      assert( iEst
18650 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  <=SQLITE_INDEX_S
18660 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 69 66  AMPLES );.    if
18670 28 20 69 45 73 74 3c 31 20 29 7b 0a 20 20 20 20  ( iEst<1 ){.    
18680 20 20 2a 70 69 45 73 74 20 3d 20 35 30 2f 53 51    *piEst = 50/SQ
18690 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
186a0 45 53 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ES;.    }else{. 
186b0 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20 28 69       *piEst = (i
186c0 45 73 74 2a 31 30 30 29 2f 53 51 4c 49 54 45 5f  Est*100)/SQLITE_
186d0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20  INDEX_SAMPLES;. 
186e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
186f0 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72  ValueFree(pLower
18700 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
18710 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65  3ValueFree(pUppe
18720 72 56 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rVal);.    retur
18730 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f  n rc;.  }.range_
18740 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65  est_fallback:.#e
18750 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
18760 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a  AMETER(pParse);.
18770 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
18780 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ER(p);.  UNUSED_
18790 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a  PARAMETER(nEq);.
187a0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
187b0 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65   pLower || pUppe
187c0 72 20 29 3b 0a 20 20 2a 70 69 45 73 74 20 3d 20  r );.  *piEst = 
187d0 31 30 30 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65  100;.  if( pLowe
187e0 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74  r && (pLower->wt
187f0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
18800 4c 4c 29 3d 3d 30 20 29 20 2a 70 69 45 73 74 20  LL)==0 ) *piEst 
18810 2f 3d 20 34 3b 0a 20 20 69 66 28 20 70 55 70 70  /= 4;.  if( pUpp
18820 65 72 20 29 20 2a 70 69 45 73 74 20 2f 3d 20 34  er ) *piEst /= 4
18830 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18840 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18850 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a 0a  ENABLE_STAT2./*.
18860 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
18870 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
18880 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
18890 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
188a0 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
188b0 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
188c0 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
188d0 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
188e0 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
188f0 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
18900 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
18910 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
18920 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
18930 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
18940 73 74 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20  stat2 histogram 
18950 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
18960 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
18970 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
18980 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
18990 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
189a0 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
189b0 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
189c0 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
189d0 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
189e0 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
189f0 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
18a00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
18a10 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
18a20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
18a30 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
18a40 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
18a50 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
18a60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18a70 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
18a80 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
18a90 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
18aa0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
18ab0 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
18ac0 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
18ad0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
18ae0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
18af0 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
18b00 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
18b10 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
18b20 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
18b30 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
18b40 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
18b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
18b60 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
18b70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18b80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18b90 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
18ba0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18bb0 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
18bc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
18bd0 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f  ex whose left-mo
18be0 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65  st column is pTe
18bf0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  rm */.  Expr *pE
18c00 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr,         /* 
18c10 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56  Expression for V
18c20 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41  ALUE in the x=VA
18c30 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  LUE constraint *
18c40 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f  /.  double *pnRo
18c50 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  w        /* Writ
18c60 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
18c70 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
18c80 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
18c90 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b  value *pRhs = 0;
18ca0 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69    /* VALUE on ri
18cb0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
18cc0 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   pTerm */.  int 
18cd0 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20  iLower, iUpper; 
18ce0 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f        /* Range o
18cf0 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69  f histogram regi
18d00 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ons containing p
18d10 52 68 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  Rhs */.  u8 aff;
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
18d40 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
18d50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18d60 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
18d70 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
18d80 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
18d90 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
18da0 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
18db0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
18dc0 72 6f 77 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rows */..  asser
18dd0 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
18de0 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   );.  aff = p->p
18df0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
18e00 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
18e10 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70  nity;.  if( pExp
18e20 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61  r ){.    rc = va
18e30 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
18e40 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
18e50 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20  &pRhs);.    if( 
18e60 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45  rc ) goto whereE
18e70 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
18e80 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  el;.  }else{.   
18e90 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56   pRhs = sqlite3V
18ea0 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e  alueNew(pParse->
18eb0 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  db);.  }.  if( p
18ec0 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rhs==0 ) return 
18ed0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
18ee0 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e  .  rc = whereRan
18ef0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
18f00 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 26 69 4c   p, pRhs, 0, &iL
18f10 6f 77 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ower);.  if( rc 
18f20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
18f30 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
18f40 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e  .  rc = whereRan
18f50 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
18f60 20 70 2c 20 70 52 68 73 2c 20 31 2c 20 26 69 55   p, pRhs, 1, &iU
18f70 70 70 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pper);.  if( rc 
18f80 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61  ) goto whereEqua
18f90 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b  lScanEst_cancel;
18fa0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
18fb0 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
18fc0 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c 6e 22  gions: %d..%d\n"
18fd0 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  , iLower, iUpper
18fe0 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77 65 72  ));.  if( iLower
18ff0 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20  >=iUpper ){.    
19000 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
19010 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49 54 45  owEst[0]/(SQLITE
19020 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32  _INDEX_SAMPLES*2
19030 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45  );.    if( nRowE
19040 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70 6e 52  st<*pnRow ) *pnR
19050 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20  ow = nRowEst;.  
19060 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f 77 45  }else{.    nRowE
19070 73 74 20 3d 20 28 69 55 70 70 65 72 2d 69 4c 6f  st = (iUpper-iLo
19080 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74  wer)*p->aiRowEst
19090 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58  [0]/SQLITE_INDEX
190a0 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 2a 70  _SAMPLES;.    *p
190b0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
190c0 20 20 7d 0a 0a 77 68 65 72 65 45 71 75 61 6c 53    }..whereEqualS
190d0 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20  canEst_cancel:. 
190e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
190f0 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72  e(pRhs);.  retur
19100 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19110 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
19120 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a  _ENABLE_STAT2) *
19130 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
19140 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a  _ENABLE_STAT2./*
19150 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
19160 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
19170 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
19180 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
19190 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
191a0 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
191b0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
191c0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
191d0 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
191e0 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
191f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
19200 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
19210 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
19220 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
19230 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
19240 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
19250 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
19260 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
19270 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
19280 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
19290 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
192a0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
192b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
192c0 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
192d0 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
192e0 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
192f0 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
19300 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
19310 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
19320 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
19330 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
19340 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
19350 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
19360 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
19370 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
19380 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
19390 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
193a0 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
193b0 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
193c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
193d0 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
193e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
193f0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
19400 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
19410 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
19420 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
19430 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
19440 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
19450 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
19460 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
19470 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
19480 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
19490 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20  double *pnRow   
194a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
194b0 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
194c0 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
194d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  {.  sqlite3_valu
194e0 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 2f 2a  e *pVal = 0;  /*
194f0 20 4f 6e 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   One value from 
19500 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  list */.  int iL
19510 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20 20 20  ower, iUpper;   
19520 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20      /* Range of 
19530 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e  histogram region
19540 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 52 68  s containing pRh
19550 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20  s */.  u8 aff;  
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
19580 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ity */.  int rc 
19590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
195a0 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
195b0 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
195c0 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73  .  double nRowEs
195d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
195e0 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
195f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
19600 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ws */.  int nSpa
19610 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
19620 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68    /* Number of h
19630 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
19640 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   spanned */.  in
19650 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 20 20  t nSingle = 0;  
19660 20 20 20 20 20 20 20 20 2f 2a 20 48 69 73 74 6f          /* Histo
19670 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 68 69 74  gram regions hit
19680 20 62 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   by a single val
19690 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 74  ue */.  int nNot
196a0 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Found = 0;      
196b0 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 76 61    /* Count of va
196c0 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  lues that are no
196d0 74 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  t constants */. 
196e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19710 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 61 53  unter */.  u8 aS
19720 70 61 6e 5b 53 51 4c 49 54 45 5f 49 4e 44 45 58  pan[SQLITE_INDEX
19730 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 20 20  _SAMPLES+1];    
19740 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67  /* Histogram reg
19750 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
19760 61 6e 6e 65 64 20 2a 2f 0a 20 20 75 38 20 61 53  anned */.  u8 aS
19770 69 6e 67 6c 65 5b 53 51 4c 49 54 45 5f 49 4e 44  ingle[SQLITE_IND
19780 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20  EX_SAMPLES+1];  
19790 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67  /* Histogram reg
197a0 69 6f 6e 73 20 68 69 74 20 6f 6e 63 65 20 2a 2f  ions hit once */
197b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
197c0 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
197d0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
197e0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
197f0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
19800 20 6d 65 6d 73 65 74 28 61 53 70 61 6e 2c 20 30   memset(aSpan, 0
19810 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 6e 29 29  , sizeof(aSpan))
19820 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 69 6e 67  ;.  memset(aSing
19830 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  le, 0, sizeof(aS
19840 69 6e 67 6c 65 29 29 3b 0a 20 20 66 6f 72 28 69  ingle));.  for(i
19850 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
19860 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
19870 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
19880 56 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 76  Val);.    rc = v
19890 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
198a0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
198b0 2e 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 56  .pExpr, aff, &pV
198c0 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  al);.    if( rc 
198d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
198e0 20 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69   pVal==0 || sqli
198f0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
19900 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Val)==SQLITE_NUL
19910 4c 20 29 7b 0a 20 20 20 20 20 20 6e 4e 6f 74 46  L ){.      nNotF
19920 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ound++;.      co
19930 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
19940 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
19950 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
19960 70 2c 20 70 56 61 6c 2c 20 30 2c 20 26 69 4c 6f  p, pVal, 0, &iLo
19970 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  wer);.    if( rc
19980 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
19990 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67   = whereRangeReg
199a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ion(pParse, p, p
199b0 56 61 6c 2c 20 31 2c 20 26 69 55 70 70 65 72 29  Val, 1, &iUpper)
199c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
199d0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 69 4c  reak;.    if( iL
199e0 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
199f0 20 20 20 20 20 20 61 53 69 6e 67 6c 65 5b 69 4c        aSingle[iL
19a00 6f 77 65 72 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  ower] = 1;.    }
19a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
19a20 72 74 28 20 69 4c 6f 77 65 72 3e 3d 30 20 26 26  rt( iLower>=0 &&
19a30 20 69 55 70 70 65 72 3c 3d 53 51 4c 49 54 45 5f   iUpper<=SQLITE_
19a40 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b  INDEX_SAMPLES );
19a50 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4c  .      while( iL
19a60 6f 77 65 72 3c 69 55 70 70 65 72 20 29 20 61 53  ower<iUpper ) aS
19a70 70 61 6e 5b 69 4c 6f 77 65 72 2b 2b 5d 20 3d 20  pan[iLower++] = 
19a80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
19a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19aa0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 53   ){.    for(i=nS
19ab0 70 61 6e 3d 30 3b 20 69 3c 3d 53 51 4c 49 54 45  pan=0; i<=SQLITE
19ac0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20  _INDEX_SAMPLES; 
19ad0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
19ae0 61 53 70 61 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  aSpan[i] ){.    
19af0 20 20 20 20 6e 53 70 61 6e 2b 2b 3b 0a 20 20 20      nSpan++;.   
19b00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 69     }else if( aSi
19b10 6e 67 6c 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20  ngle[i] ){.     
19b20 20 20 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20     nSingle++;.  
19b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19b40 6e 52 6f 77 45 73 74 20 3d 20 28 6e 53 70 61 6e  nRowEst = (nSpan
19b50 2a 32 2b 6e 53 69 6e 67 6c 65 29 2a 70 2d 3e 61  *2+nSingle)*p->a
19b60 69 52 6f 77 45 73 74 5b 30 5d 2f 28 32 2a 53 51  iRowEst[0]/(2*SQ
19b70 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
19b80 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ES).            
19b90 20 20 20 2b 20 6e 4e 6f 74 46 6f 75 6e 64 2a 70     + nNotFound*p
19ba0 2d 3e 61 69 52 6f 77 45 73 74 5b 31 5d 3b 0a 20  ->aiRowEst[1];. 
19bb0 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
19bc0 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20   p->aiRowEst[0] 
19bd0 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61  ) nRowEst = p->a
19be0 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
19bf0 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
19c00 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
19c10 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  (("IN row estima
19c20 74 65 3a 20 6e 53 70 61 6e 3d 25 64 2c 20 6e 53  te: nSpan=%d, nS
19c30 69 6e 67 6c 65 3d 25 64 2c 20 6e 4e 6f 74 46 6f  ingle=%d, nNotFo
19c40 75 6e 64 3d 25 64 2c 20 65 73 74 3d 25 67 5c 6e  und=%d, est=%g\n
19c50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19c60 20 20 20 20 6e 53 70 61 6e 2c 20 6e 53 69 6e 67      nSpan, nSing
19c70 6c 65 2c 20 6e 4e 6f 74 46 6f 75 6e 64 2c 20 6e  le, nNotFound, n
19c80 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
19c90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19ca0 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
19cb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
19cc0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19cd0 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f  ENABLE_STAT2) */
19ce0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  .../*.** Find th
19cf0 65 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  e best query pla
19d00 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
19d10 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
19d20 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  le.  Write the.*
19d30 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  * best query pla
19d40 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  n and its cost i
19d50 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73  nto the WhereCos
19d60 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65  t object supplie
19d70 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74  d as the.** last
19d80 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
19d90 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
19da0 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68  t plan wins.  Th
19db0 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
19dc0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
19dd0 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
19de0 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65  d disk I/O neede
19df0 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
19e00 20 72 65 71 75 65 73 74 65 64 20 72 65 73 75 6c   requested resul
19e10 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  t..** Factors th
19e20 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
19e30 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
19e40 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
19e50 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
19e60 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
19e70 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
19e80 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
19e90 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
19ea0 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
19eb0 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
19ec0 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
19ed0 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
19ee0 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
19ef0 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
19f00 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
19f10 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
19f20 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
19f30 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
19f40 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
19f50 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 72  D BY clause (pSr
19f60 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63  c->pIndex) attac
19f70 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  hed to the table
19f80 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73   in.** the SQL s
19f90 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74  tatement, then t
19fa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
19fb0 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e  y considers plan
19fc0 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  s using the .** 
19fd0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20  named index. If 
19fe0 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20  no such plan is 
19ff0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
1a000 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73  returned cost is
1a010 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  .** SQLITE_BIG_D
1a020 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73  BL. If a plan is
1a030 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73   found that uses
1a040 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1a050 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  , .** then the c
1a060 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65  ost is calculate
1a070 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77  d in the usual w
1a080 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e  ay..**.** If a N
1a090 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1a0a0 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  e (pSrc->notInde
1a0b0 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74 61  xed!=0) was atta
1a0c0 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
1a0d0 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c  e .** in the SEL
1a0e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1a0f0 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20 61  hen no indexes a
1a100 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 48  re considered. H
1a110 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20  owever, the .** 
1a120 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d 61  selected plan ma
1a130 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64 76  y still take adv
1a140 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 62 75  antage of the bu
1a150 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70 72 69  ilt-in rowid pri
1a160 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e 64 65  mary key.** inde
1a170 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1a180 64 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  d bestBtreeIndex
1a190 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1a1a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a1b0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1a1c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1a1d0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
1a1e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1a1f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1a200 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a210 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
1a220 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1a230 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
1a240 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
1a250 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
1a260 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
1a270 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
1a280 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
1a290 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
1a2a0 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
1a2b0 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
1a2c0 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
1a2d0 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
1a2e0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
1a2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a300 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a310 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1a320 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  Distinct,       
1a330 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c   /* The select-l
1a340 69 73 74 20 69 66 20 71 75 65 72 79 20 69 73 20  ist if query is 
1a350 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 57 68  DISTINCT */.  Wh
1a360 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
1a370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
1a380 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
1a390 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lan */.){.  int 
1a3a0 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
1a3b0 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
1a3c0 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
1a3d0 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
1a3e0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
1a3f0 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
1a400 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
1a410 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
1a420 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
1a430 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1a440 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72    /* Copy of pPr
1a450 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72  obe, or zero for
1a460 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   IPK index */.  
1a470 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20  int eqTermMask; 
1a480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a490 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76  urrent mask of v
1a4a0 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1a4b0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
1a4c0 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20   idxEqTermMask; 
1a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1a4e0 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  x mask of valid 
1a4f0 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
1a500 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  rs */.  Index sP
1a510 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1a520 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
1a530 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
1a540 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
1a550 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
1a560 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
1a570 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
1a580 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
1a590 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
1a5a0 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  nt aiColumnPk = 
1a5b0 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
1a5c0 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
1a5d0 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
1a5e0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46  dex */.  int wsF
1a5f0 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  lagMask;        
1a600 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20       /* Allowed 
1a610 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e  flags in pCost->
1a620 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a  plan.wsFlag */..
1a630 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1a640 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f  the cost to a wo
1a650 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a  rst-case value *
1a660 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74  /.  memset(pCost
1a670 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
1a680 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72  st));.  pCost->r
1a690 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
1a6a0 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20  G_DBL;..  /* If 
1a6b0 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69  the pSrc table i
1a6c0 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
1a6d0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
1a6e0 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74   then we may not
1a6f0 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64  .  ** use an ind
1a700 65 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53  ex to satisfy IS
1a710 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1a720 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  s on that table.
1a730 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62    This is.  ** b
1a740 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d  ecause columns m
1a750 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
1a760 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61  g NULL if the ta
1a770 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ble does not mat
1a780 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63  ch -.  ** a circ
1a790 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74  umstance which t
1a7a0 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
1a7b0 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72  help us discover
1a7c0 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e  .  Ticket #2177.
1a7d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  .  */.  if( pSrc
1a7e0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1a7f0 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45  LEFT ){.    idxE
1a800 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
1a810 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  Q|WO_IN;.  }else
1a820 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
1a830 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
1a840 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  N|WO_ISNULL;.  }
1a850 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
1a860 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
1a870 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1a880 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
1a890 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1a8a0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
1a8b0 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70  Idx = pProbe = p
1a8c0 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Src->pIndex;.   
1a8d0 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
1a8e0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1a8f0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1a900 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1a910 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
1a920 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1a930 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
1a940 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a950 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
1a960 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
1a970 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61   local.    ** va
1a980 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65  riable sPk to re
1a990 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
1a9a0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
1a9b0 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a  dex.  Make this.
1a9c0 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65      ** fake inde
1a9d0 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  x the first in a
1a9e0 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20   chain of Index 
1a9f0 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c  objects with all
1aa00 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20   of the real.   
1aa10 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66   ** indices to f
1aa20 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64  ollow */.    Ind
1aa30 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  ex *pFirst;     
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa50 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e  First of real in
1aa60 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
1aa70 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
1aa80 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
1aa90 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
1aaa0 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
1aab0 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
1aac0 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
1aad0 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
1aae0 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
1aaf0 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20    sPk.onError = 
1ab00 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20  OE_Replace;.    
1ab10 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72  sPk.pTable = pSr
1ab20 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52  c->pTab;.    aiR
1ab30 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72  owEstPk[0] = pSr
1ab40 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  c->pTab->nRowEst
1ab50 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
1ab60 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69  [1] = 1;.    pFi
1ab70 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  rst = pSrc->pTab
1ab80 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  ->pIndex;.    if
1ab90 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
1aba0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ed==0 ){.      /
1abb0 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63  * The real indic
1abc0 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
1abd0 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  are only conside
1abe0 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20  red if the.     
1abf0 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   ** NOT INDEXED 
1ac00 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69  qualifier is omi
1ac10 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52  tted from the FR
1ac20 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1ac30 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70     sPk.pNext = p
1ac40 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  First;.    }.   
1ac50 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a   pProbe = &sPk;.
1ac60 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
1ac70 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45 52   ~(.        WHER
1ac80 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1ac90 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1aca0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48  E_COLUMN_NULL|WH
1acb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1acc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65  .    );.    eqTe
1acd0 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
1ace0 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d  O_IN;.    pIdx =
1acf0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   0;.  }..  /* Lo
1ad00 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69  op over all indi
1ad10 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ces looking for 
1ad20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20  the best one to 
1ad30 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  use.  */.  for(;
1ad40 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50   pProbe; pIdx=pP
1ad50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
1ad60 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  xt){.    const u
1ad70 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f  nsigned int * co
1ad80 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70  nst aiRowEst = p
1ad90 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b  Probe->aiRowEst;
1ada0 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
1adb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1adc0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e   /* Cost of usin
1add0 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20  g pProbe */.    
1ade0 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20  double nRow;    
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1ae00 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
1ae10 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c  of rows in resul
1ae20 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75  t set */.    dou
1ae30 62 6c 65 20 6c 6f 67 31 30 4e 3b 20 20 20 20 20  ble log10N;     
1ae40 20 20 20 20 20 20 20 20 20 2f 2a 20 62 61 73 65           /* base
1ae50 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  -10 logarithm of
1ae60 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20   nRow (inexact) 
1ae70 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20  */.    int rev; 
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
1aea0 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1aeb0 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77  der */.    int w
1aec0 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  sFlags = 0;.    
1aed0 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
1aee0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ;..    /* The fo
1aef0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
1af00 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
1af10 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f  based on the pro
1af20 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a  perties of.    *
1af30 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  * index being ev
1af40 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72  aluated. They ar
1af50 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64  e then used to d
1af60 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70  etermine the exp
1af70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73  ected.    ** cos
1af80 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  t and number of 
1af90 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  rows returned.. 
1afa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45     **.    **  nE
1afb0 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75  q: .    **    Nu
1afc0 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
1afd0 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20   terms that can 
1afe0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  be implemented u
1aff0 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a  sing the index..
1b000 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68      **    In oth
1b010 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75  er words, the nu
1b020 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20  mber of initial 
1b030 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e  fields in the in
1b040 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  dex that.    ** 
1b050 20 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d     are used in =
1b060 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e  = or IN or NOT N
1b070 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1b080 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1b090 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
1b0a0 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20  **  nInMul:  .  
1b0b0 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d    **    The "in-
1b0c0 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69  multiplier". Thi
1b0d0 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  s is an estimate
1b0e0 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65   of how many see
1b0f0 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20  k operations .  
1b100 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d    **    SQLite m
1b110 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74  ust perform on t
1b120 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73  he index in ques
1b130 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tion. For exampl
1b140 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1b150 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73  *    WHERE claus
1b160 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e is:.    **.   
1b170 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
1b180 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e   IN (1, 2, 3) AN
1b190 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29  D b IN (4, 5, 6)
1b1a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1b1b0 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65    SQLite must pe
1b1c0 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20  rform 9 lookups 
1b1d0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28  on an index on (
1b1e0 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c  a, b), so nInMul
1b1f0 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73   is .    **    s
1b200 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74  et to 9. Given t
1b210 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  he same schema a
1b220 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  nd either of the
1b230 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45   following WHERE
1b240 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75   .    **    clau
1b250 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ses:.    **.    
1b260 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1b270 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  =  1.    **     
1b280 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20   WHERE a >= 2.  
1b290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e    **.    **    n
1b2a0 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20  InMul is set to 
1b2b0 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
1b2c0 20 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69      If there exi
1b2d0 73 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d  sts a WHERE term
1b2e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
1b2f0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1b300 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20  , then .    **  
1b310 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74    the sub-select
1b320 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72   is assumed to r
1b330 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f  eturn 25 rows fo
1b340 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1b350 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74  f .    **    det
1b360 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e  ermining nInMul.
1b370 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1b380 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a  bInEst:  .    **
1b390 20 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20      Set to true 
1b3a0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20  if there was at 
1b3b0 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20  least one "x IN 
1b3c0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65  (SELECT ...)" te
1b3d0 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20  rm used .    ** 
1b3e0 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e     in determinin
1b3f0 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  g the value of n
1b400 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61  InMul.  Note tha
1b410 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
1b420 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70  .    **    IN op
1b430 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61  erator must be a
1b440 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76   SELECT, not a v
1b450 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74  alue list, for t
1b460 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20  his variable.   
1b470 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75   **    to be tru
1b480 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1b490 20 20 65 73 74 42 6f 75 6e 64 3a 0a 20 20 20 20    estBound:.    
1b4a0 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74  **    An estimat
1b4b0 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  e on the amount 
1b4c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
1b4d0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
1b4e0 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20 20 20  ed.  A.    **   
1b4f0 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20 6d 65   value of 100 me
1b500 61 6e 73 20 74 68 65 20 65 6e 74 69 72 65 20 74  ans the entire t
1b510 61 62 6c 65 20 69 73 20 73 65 61 72 63 68 65 64  able is searched
1b520 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73 74 72 61  .  Range constra
1b530 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6d  ints.    **    m
1b540 69 67 68 74 20 72 65 64 75 63 65 20 74 68 69 73  ight reduce this
1b550 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73 73   to a value less
1b560 20 74 68 61 6e 20 31 30 30 20 74 6f 20 69 6e 64   than 100 to ind
1b570 69 63 61 74 65 20 74 68 61 74 20 6f 6e 6c 79 0a  icate that only.
1b580 20 20 20 20 2a 2a 20 20 20 20 61 20 66 72 61 63      **    a frac
1b590 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1b5a0 65 20 6e 65 65 64 73 20 73 65 61 72 63 68 69 6e  e needs searchin
1b5b0 67 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e  g.  In the absen
1b5c0 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20  ce of.    **    
1b5d0 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41  sqlite_stat2 ANA
1b5e0 4c 59 5a 45 20 64 61 74 61 2c 20 61 20 73 69 6e  LYZE data, a sin
1b5f0 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  gle inequality r
1b600 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
1b610 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63  h.    **    spac
1b620 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 20 6f  e to 1/4rd its o
1b630 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20 20 53  riginal size.  S
1b640 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74 72 61  o an x>? constra
1b650 69 6e 74 20 72 65 64 75 63 65 73 0a 20 20 20 20  int reduces.    
1b660 2a 2a 20 20 20 20 65 73 74 42 6f 75 6e 64 20 74  **    estBound t
1b670 6f 20 32 35 2e 20 20 54 77 6f 20 63 6f 6e 73 74  o 25.  Two const
1b680 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20  raints (x>? AND 
1b690 78 3c 3f 29 20 72 65 64 75 63 65 20 65 73 74 42  x<?) reduce estB
1b6a0 6f 75 6e 64 20 74 6f 20 36 2e 0a 20 20 20 20 2a  ound to 6..    *
1b6b0 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a  *.    **  bSort:
1b6c0 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f     .    **    Bo
1b6d0 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74  olean. True if t
1b6e0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1b6f0 20 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20   BY clause that 
1b700 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20  will require an 
1b710 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72  .    **    exter
1b720 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73  nal sort (i.e. s
1b730 63 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  canning the inde
1b740 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  x being evaluate
1b750 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20  d will not .    
1b760 2a 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20  **    correctly 
1b770 6f 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a  order records)..
1b780 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1b790 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20  Lookup: .    ** 
1b7a0 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1b7b0 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   if a table look
1b7c0 75 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66  up is required f
1b7d0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e  or each index en
1b7e0 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69  try.    **    vi
1b7f0 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72  sited.  In other
1b800 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20   words, true if 
1b810 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f  this is not a co
1b820 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  vering index..  
1b830 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20    **    This is 
1b840 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72  always false for
1b850 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61   the rowid prima
1b860 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20  ry key index of 
1b870 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  a table..    ** 
1b880 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64     For other ind
1b890 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65  exes, it is true
1b8a0 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20   unless all the 
1b8b0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
1b8c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75  able.    **    u
1b8d0 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  sed by the SELEC
1b8e0 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  T statement are 
1b8f0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
1b900 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20  ndex (such an.  
1b910 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73    **    index is
1b920 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72   sometimes descr
1b930 69 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69  ibed as a coveri
1b940 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a  ng index)..    *
1b950 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
1b960 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65  , given the inde
1b970 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1b980 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66   second of the f
1b990 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a  ollowing .    **
1b9a0 20 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20      two queries 
1b9b0 72 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62  requires table b
1b9c0 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  -tree lookups in
1b9d0 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74   order to find t
1b9e0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
1b9f0 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20     of column c, 
1ba00 62 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f  but the first do
1ba10 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63  es not because c
1ba20 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61  olumns a and b a
1ba30 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74  re.    **    bot
1ba40 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  h available in t
1ba50 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
1ba60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ba70 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
1ba80 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52     FROM tbl WHER
1ba90 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20  E a = 1;.    ** 
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
1bab0 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
1bac0 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
1bad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1bae0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
1baf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bb00 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
1bb10 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 69  terms matching i
1bb20 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
1bb30 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20  bInEst = 0;     
1bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1bb50 65 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45  e if "x IN (SELE
1bb60 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a  CT...)" seen */.
1bb70 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d      int nInMul =
1bb80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1bb90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
1bba0 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69  istinct equaliti
1bbb0 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a  es to lookup */.
1bbc0 20 20 20 20 69 6e 74 20 65 73 74 42 6f 75 6e 64      int estBound
1bbd0 20 3d 20 31 30 30 3b 20 20 20 20 20 20 20 20 20   = 100;         
1bbe0 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72    /* Estimated r
1bbf0 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72  eduction in sear
1bc00 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ch space */.    
1bc10 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20  int nBound = 0; 
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc30 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65   Number of range
1bc40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65   constraints see
1bc50 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f  n */.    int bSo
1bc60 72 74 20 3d 20 21 21 70 4f 72 64 65 72 42 79 3b  rt = !!pOrderBy;
1bc70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1bc80 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20  f external sort 
1bc90 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
1bca0 69 6e 74 20 62 44 69 73 74 20 3d 20 21 21 70 44  int bDist = !!pD
1bcb0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a  istinct;      /*
1bcc0 20 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63   True if index c
1bcd0 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20  annot help with 
1bce0 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20  DISTINCT */.    
1bcf0 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b  int bLookup = 0;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd10 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63   True if not a c
1bd20 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1bd30 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1bd40 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1bd50 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
1bd60 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1bd70 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65   clause */.#ifde
1bd80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1bd90 53 54 41 54 32 0a 20 20 20 20 57 68 65 72 65 54  STAT2.    WhereT
1bda0 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20  erm *pFirstTerm 
1bdb0 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  = 0;    /* First
1bdc0 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74   term matching t
1bdd0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64  he index */.#end
1bde0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72  if..    /* Deter
1bdf0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20  mine the values 
1be00 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75  of nEq and nInMu
1be10 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71  l */.    for(nEq
1be20 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  =0; nEq<pProbe->
1be30 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b  nColumn; nEq++){
1be40 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
1be50 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
1be60 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
1be70 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1be80 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1be90 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c  ady, eqTermMask,
1bea0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   pIdx);.      if
1beb0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
1bec0 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67  ak;.      wsFlag
1bed0 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55  s |= (WHERE_COLU
1bee0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  MN_EQ|WHERE_ROWI
1bef0 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69 66 28  D_EQ);.      if(
1bf00 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1bf10 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  r & WO_IN ){.   
1bf20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1bf30 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1bf40 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
1bf50 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
1bf60 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _IN;.        if(
1bf70 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1bf80 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1bf90 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1bfa0 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c     /* "x IN (SEL
1bfb0 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75  ECT ...)":  Assu
1bfc0 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  me the SELECT re
1bfd0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
1bfe0 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1bff0 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
1c000 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
1c010 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c020 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
1c030 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d  .pList && pExpr-
1c040 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1c050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1c060 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
1c070 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
1c080 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
1c090 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  *= pExpr->x.pLis
1c0a0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1c0b0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1c0c0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1c0d0 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
1c0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
1c0f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
1c100 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
1c110 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1c120 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20  ENABLE_STAT2.   
1c130 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26     if( nEq==0 &&
1c140 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65   pProbe->aSample
1c150 20 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20   ) pFirstTerm = 
1c160 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  pTerm;.#endif.  
1c170 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72      used |= pTer
1c180 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
1c190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
1c1a0 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
1c1b0 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a  e of estBound. *
1c1c0 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
1c1d0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  robe->nColumn &&
1c1e0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
1c1f0 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
1c200 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
1c210 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
1c220 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
1c230 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
1c240 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
1c250 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1c260 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20  E, pIdx) ){.    
1c270 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1c280 54 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Top = findTerm(p
1c290 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1c2a0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
1c2b0 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  LE, pIdx);.     
1c2c0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42     WhereTerm *pB
1c2d0 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  tm = findTerm(pW
1c2e0 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
1c2f0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
1c300 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1c310 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
1c320 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f  Est(pParse, pPro
1c330 62 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70  be, nEq, pBtm, p
1c340 54 6f 70 2c 20 26 65 73 74 42 6f 75 6e 64 29 3b  Top, &estBound);
1c350 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
1c360 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  p ){.          n
1c370 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  Bound = 1;.     
1c380 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c390 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
1c3a0 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20  .          used 
1c3b0 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52  |= pTop->prereqR
1c3c0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ight;.        }.
1c3d0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 6d          if( pBtm
1c3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42   ){.          nB
1c3f0 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ound++;.        
1c400 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1c410 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
1c420 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
1c430 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  pBtm->prereqRigh
1c440 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
1c450 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c460 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
1c470 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  NGE|WHERE_ROWID_
1c480 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a  RANGE);.      }.
1c490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
1c4a0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  robe->onError!=O
1c4b0 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
1c4c0 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
1c4d0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1c4e0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IN );.      tes
1c4f0 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26  tcase( wsFlags &
1c500 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
1c510 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LL );.      if( 
1c520 28 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  (wsFlags & (WHER
1c530 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52  E_COLUMN_IN|WHER
1c540 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d  E_COLUMN_NULL))=
1c550 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  =0 ){.        ws
1c560 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
1c570 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20  NIQUE;.      }. 
1c580 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c590 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1c5a0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
1c5b0 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
1c5c0 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a  considered will.
1c5d0 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79      ** naturally
1c5e0 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68   scan rows in th
1c5f0 65 20 72 65 71 75 69 72 65 64 20 6f 72 64 65 72  e required order
1c600 2c 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70  , set the approp
1c610 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20  riate flags.    
1c620 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f  ** in wsFlags. O
1c630 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1c640 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
1c650 59 20 63 6c 61 75 73 65 20 62 75 74 20 74 68 65  Y clause but the
1c660 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69   index.    ** wi
1c670 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20  ll scan rows in 
1c680 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
1c690 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74  r, set the bSort
1c6a0 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
1c6b0 20 20 20 69 66 28 20 69 73 53 6f 72 74 69 6e 67     if( isSorting
1c6c0 49 6e 64 65 78 28 0a 20 20 20 20 20 20 20 20 20  Index(.         
1c6d0 20 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 70 4d   pParse, pWC->pM
1c6e0 61 73 6b 53 65 74 2c 20 70 50 72 6f 62 65 2c 20  askSet, pProbe, 
1c6f0 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
1c700 6e 45 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72  nEq, wsFlags, &r
1c710 65 76 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ev).    ){.     
1c720 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   bSort = 0;.    
1c730 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1c740 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57  RE_ROWID_RANGE|W
1c750 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1c760 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  E|WHERE_ORDERBY;
1c770 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
1c780 3d 20 28 72 65 76 20 3f 20 57 48 45 52 45 5f 52  = (rev ? WHERE_R
1c790 45 56 45 52 53 45 20 3a 20 30 29 3b 0a 20 20 20  EVERSE : 0);.   
1c7a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1c7b0 65 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43  ere is a DISTINC
1c7c0 54 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20  T qualifier and 
1c7d0 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20  this index will 
1c7e0 73 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20  scan rows in.   
1c7f0 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65   ** order of the
1c800 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73   DISTINCT expres
1c810 73 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69  sions, clear bDi
1c820 73 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 61  st and set the a
1c830 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a  ppropriate.    *
1c840 2a 20 66 6c 61 67 73 20 69 6e 20 77 73 46 6c 61  * flags in wsFla
1c850 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  gs. */.    if( i
1c860 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70  sDistinctIndex(p
1c870 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f  Parse, pWC, pPro
1c880 62 65 2c 20 69 43 75 72 2c 20 70 44 69 73 74 69  be, iCur, pDisti
1c890 6e 63 74 2c 20 6e 45 71 29 20 29 7b 0a 20 20 20  nct, nEq) ){.   
1c8a0 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20     bDist = 0;.  
1c8b0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1c8c0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1c8d0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1c8e0 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  NGE|WHERE_DISTIN
1c8f0 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CT;.    }..    /
1c900 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63  * If currently c
1c910 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63  alculating the c
1c920 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  ost of using an 
1c930 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49  index (not the I
1c940 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29  PK.    ** index)
1c950 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  , determine if a
1c960 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  ll required colu
1c970 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f  mn data may be o
1c980 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
1c990 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  .    ** using th
1c9a0 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e  e main table (i.
1c9b0 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  e. if the index 
1c9c0 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20  is a covering.  
1c9d0 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74    ** index for t
1c9e0 68 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69  his query). If i
1c9f0 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48  t is, set the WH
1ca00 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61  ERE_IDX_ONLY fla
1ca10 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c  g in.    ** wsFl
1ca20 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ags. Otherwise, 
1ca30 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20  set the bLookup 
1ca40 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65  variable to true
1ca50 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  .  */.    if( pI
1ca60 64 78 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b  dx && wsFlags ){
1ca70 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1ca80 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
1ca90 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
1caa0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1cab0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
1cac0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
1cad0 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
1cae0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
1caf0 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20  if( x<BMS-1 ){. 
1cb00 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28           m &= ~(
1cb10 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29  ((Bitmask)1)<<x)
1cb20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cb30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d    }.      if( m=
1cb40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  =0 ){.        ws
1cb50 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
1cb60 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
1cb70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c  else{.        bL
1cb80 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  ookup = 1;.     
1cb90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1cba0 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65  .    ** Estimate
1cbb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1cbc0 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  ows of output.  
1cbd0 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45  For an "x IN (SE
1cbe0 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  LECT...)".    **
1cbf0 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20   constraint, do 
1cc00 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69  not let the esti
1cc10 6d 61 74 65 20 65 78 63 65 65 64 20 68 61 6c 66  mate exceed half
1cc20 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
1cc30 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
1cc40 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c     nRow = (doubl
1cc50 65 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d  e)(aiRowEst[nEq]
1cc60 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20   * nInMul);.    
1cc70 69 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52  if( bInEst && nR
1cc80 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d  ow*2>aiRowEst[0]
1cc90 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   ){.      nRow =
1cca0 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a   aiRowEst[0]/2;.
1ccb0 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28        nInMul = (
1ccc0 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f  int)(nRow / aiRo
1ccd0 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20  wEst[nEq]);.    
1cce0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1ccf0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20  _ENABLE_STAT2.  
1cd00 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73    /* If the cons
1cd10 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65  traint is of the
1cd20 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 61 6e   form x=VALUE an
1cd30 64 20 68 69 73 74 6f 67 72 61 6d 0a 20 20 20 20  d histogram.    
1cd40 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  ** data is avail
1cd50 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  able for column 
1cd60 78 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  x, then it might
1cd70 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
1cd80 20 2a 2a 20 74 6f 20 67 65 74 20 61 20 62 65 74   ** to get a bet
1cd90 74 65 72 20 65 73 74 69 6d 61 74 65 20 6f 6e 20  ter estimate on 
1cda0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1cdb0 77 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20  ws based on.    
1cdc0 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20 68 6f 77  ** VALUE and how
1cdd0 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c   common that val
1cde0 75 65 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  ue is according 
1cdf0 74 6f 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  to the histogram
1ce00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ce10 20 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20   nRow>(double)1 
1ce20 26 26 20 6e 45 71 3d 3d 31 20 26 26 20 70 46 69  && nEq==1 && pFi
1ce30 72 73 74 54 65 72 6d 21 3d 30 20 29 7b 0a 20 20  rstTerm!=0 ){.  
1ce40 20 20 20 20 69 66 28 20 70 46 69 72 73 74 54 65      if( pFirstTe
1ce50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1ce60 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
1ce70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  ) ){.        tes
1ce80 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
1ce90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1cea0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _EQ );.        t
1ceb0 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54  estcase( pFirstT
1cec0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
1ced0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
1cee0 20 20 20 20 20 77 68 65 72 65 45 71 75 61 6c 53       whereEqualS
1cef0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
1cf00 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72  Probe, pFirstTer
1cf10 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1cf20 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  , &nRow);.      
1cf30 7d 65 6c 73 65 20 69 66 28 20 70 46 69 72 73 74  }else if( pFirst
1cf40 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
1cf50 3d 57 4f 5f 49 4e 20 26 26 20 62 49 6e 45 73 74  =WO_IN && bInEst
1cf60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ==0 ){.        w
1cf70 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50  hereInScanEst(pP
1cf80 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46  arse, pProbe, pF
1cf90 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d  irstTerm->pExpr-
1cfa0 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29  >x.pList, &nRow)
1cfb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cfc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1cfd0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f  _ENABLE_STAT2 */
1cfe0 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20  ..    /* Adjust 
1cff0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
1d000 74 70 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f  tput rows and do
1d010 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63  wnward to reflec
1d020 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68  t rows.    ** th
1d030 61 74 20 61 72 65 20 65 78 63 6c 75 64 65 64 20  at are excluded 
1d040 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  by range constra
1d050 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
1d060 20 6e 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20   nRow = (nRow * 
1d070 28 64 6f 75 62 6c 65 29 65 73 74 42 6f 75 6e 64  (double)estBound
1d080 29 20 2f 20 28 64 6f 75 62 6c 65 29 31 30 30 3b  ) / (double)100;
1d090 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3c 31 20  .    if( nRow<1 
1d0a0 29 20 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20  ) nRow = 1;..   
1d0b0 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20   /* Experiments 
1d0c0 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69  run on real SQLi
1d0d0 74 65 20 64 61 74 61 62 61 73 65 73 20 73 68 6f  te databases sho
1d0e0 77 20 74 68 61 74 20 74 68 65 20 74 69 6d 65 20  w that the time 
1d0f0 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f  needed.    ** to
1d100 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
1d110 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  rch to locate a 
1d120 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f  row in a table o
1d130 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68  r index is rough
1d140 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28  ly.    ** log10(
1d150 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d  N) times the tim
1d160 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f  e to move from o
1d170 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65  ne row to the ne
1d180 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20  xt row within.  
1d190 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20    ** a table or 
1d1a0 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63 74 75  index.  The actu
1d1b0 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72  al times can var
1d1c0 79 2c 20 77 69 74 68 20 74 68 65 20 73 69 7a 65  y, with the size
1d1d0 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72   of.    ** recor
1d1e0 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f  ds being an impo
1d1f0 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42  rtant factor.  B
1d200 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65  oth moves and se
1d210 61 72 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a  arches are.    *
1d220 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61  * slower with la
1d230 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72  rger records, pr
1d240 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65  esumably because
1d250 20 66 65 77 65 72 20 72 65 63 6f 72 64 73 20 66   fewer records f
1d260 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65  it.    ** on one
1d270 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20   page and hence 
1d280 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76 65 20  more pages have 
1d290 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20  to be fetched.. 
1d2a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1d2b0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1d2c0 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
1d2d0 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65  stat1 and sqlite
1d2e0 5f 73 74 61 74 32 20 74 61 62 6c 65 73 20 64 6f  _stat2 tables do
1d2f0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65  .    ** not give
1d300 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20   us data on the 
1d310 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
1d320 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  f table and inde
1d330 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  x records..    *
1d340 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74  * So this comput
1d350 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61  ation assumes ta
1d360 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  ble records are 
1d370 61 62 6f 75 74 20 74 77 69 63 65 20 61 73 20 62  about twice as b
1d380 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64  ig.    ** as ind
1d390 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a  ex records.    *
1d3a0 2f 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61  /.    if( (wsFla
1d3b0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1d3c0 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20  ULLSCAN)==0 ){. 
1d3d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1d3e0 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
1d3f0 20 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65   scan is a numbe
1d400 72 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74  r of move operat
1d410 69 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20  ions equal.     
1d420 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65   ** to the numbe
1d430 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d440 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a   table..      **
1d450 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64  .      ** We add
1d460 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34   an additional 4
1d470 78 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c  x penalty to ful
1d480 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20  l table scans.  
1d490 54 68 69 73 20 63 61 75 73 65 73 0a 20 20 20 20  This causes.    
1d4a0 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75    ** the cost fu
1d4b0 6e 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e  nction to err on
1d4c0 20 74 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f   the side of cho
1d4d0 6f 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f  osing an index o
1d4e0 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f  ver.      ** cho
1d4f0 6f 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61  osing a full sca
1d500 6e 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c  n.  This 4x full
1d510 2d 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73  -scan penalty is
1d520 20 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20   an arguable.   
1d530 20 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61     ** decision a
1d540 6e 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20  nd one which we 
1d550 65 78 70 65 63 74 20 74 6f 20 72 65 76 69 73 69  expect to revisi
1d560 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1d570 20 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69    But.      ** i
1d580 74 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f  t seems to be wo
1d590 72 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67  rking well enoug
1d5a0 68 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e  h at the moment.
1d5b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d5c0 63 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b  cost = aiRowEst[
1d5d0 30 5d 2a 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0]*4;.    }else{
1d5e0 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20  .      log10N = 
1d5f0 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b  estLog(aiRowEst[
1d600 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  0]);.      cost 
1d610 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  = nRow;.      if
1d620 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
1d630 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b    if( bLookup ){
1d640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
1d650 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  r an index looku
1d660 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  p followed by a 
1d670 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20  table lookup:.  
1d680 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1d690 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63  nMul index searc
1d6a0 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
1d6b0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e  start of each in
1d6c0 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20  dex range.      
1d6d0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1d6e0 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1d6f0 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
1d700 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c   **  + nRow tabl
1d710 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f  e searches to lo
1d720 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20 65  okup the table e
1d730 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 72  ntry using the r
1d740 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a  owid.          *
1d750 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  /.          cost
1d760 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52   += (nInMul + nR
1d770 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  ow)*log10N;.    
1d780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d790 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f       /* For a co
1d7a0 76 65 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20  vering index:.  
1d7b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e          **     n
1d7c0 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
1d7d0 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1d7e0 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a   initial entry .
1d7f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b            **   +
1d800 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f   nRow steps thro
1d810 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20  ugh the index.  
1d820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d830 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e       cost += nIn
1d840 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
1d850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1d860 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  e{.        /* Fo
1d870 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72  r a rowid primar
1d880 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20  y key lookup:.  
1d890 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
1d8a0 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63 68  ult table search
1d8b0 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1d8c0 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72  nitial entry for
1d8d0 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20   each range.    
1d8e0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1d8f0 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1d900 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
1d910 2f 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  /.        cost +
1d920 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b  = nInMul*log10N;
1d930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d940 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68      /* Add in th
1d950 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
1d960 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
1d970 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20  result.  Actual 
1d980 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20  experimental.   
1d990 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73   ** measurements
1d9a0 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66   of sorting perf
1d9b0 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74  ormance in SQLit
1d9c0 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74  e show that sort
1d9d0 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ing time.    ** 
1d9e0 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e  adds C*N*log10(N
1d9f0 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77  ) to the cost, w
1da00 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1da10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
1da20 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65  be .    ** sorte
1da30 64 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63  d and C is a fac
1da40 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35  tor between 1.95
1da50 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69   and 4.3.  We wi
1da60 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20  ll split the.   
1da70 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61   ** difference a
1da80 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33  nd select C of 3
1da90 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .0..    */.    i
1daa0 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( bSort ){.    
1dab0 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65    cost += nRow*e
1dac0 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20  stLog(nRow)*3;. 
1dad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69     }.    if( bDi
1dae0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  st ){.      cost
1daf0 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
1db00 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a  nRow)*3;.    }..
1db10 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
1db20 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
1db30 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
1db40 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
1db50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1db60 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
1db70 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
1db80 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
1db90 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
1dba0 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
1dbb0 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
1dbc0 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
1dbd0 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
1dbe0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
1dbf0 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
1dc00 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
1dc10 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
1dc20 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
1dc30 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
1dc40 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
1dc50 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
1dc60 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
1dc70 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
1dc80 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
1dc90 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
1dca0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
1dcb0 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
1dcc0 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
1dcd0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
1dce0 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
1dcf0 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
1dd00 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
1dd10 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
1dd20 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1dd30 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
1dd40 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
1dd50 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
1dd60 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
1dd70 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
1dd80 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
1dd90 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
1dda0 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
1ddb0 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
1ddc0 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
1ddd0 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
1dde0 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
1ddf0 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
1de00 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
1de10 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
1de20 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
1de30 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
1de40 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
1de50 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
1de60 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1de70 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
1de80 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
1de90 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
1dea0 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
1deb0 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
1dec0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
1ded0 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
1dee0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
1def0 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
1df00 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
1df10 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
1df20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1df30 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
1df40 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
1df50 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1df80 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1df90 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20   nSkipEq = nEq; 
1dfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dfb0 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72  ber of == constr
1dfc0 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f  aints to skip */
1dfd0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
1dfe0 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20  Range = nBound; 
1dff0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e000 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74   < constraints t
1e010 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
1e020 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b  Bitmask thisTab;
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e040 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20  Bitmap for pSrc 
1e050 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61  */..      thisTa
1e060 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  b = getMask(pWC-
1e070 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
1e080 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
1e090 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
1e0a0 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26  >nTerm; nRow>2 &
1e0b0 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
1e0c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1e0d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1e0e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
1e0f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e100 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1e110 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c  ereqAll & notVal
1e120 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
1e130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e140 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1e150 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1e160 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
1e170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e180 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
1e190 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1e1a0 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
1e1b0 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
1e1c0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1e1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e1e0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1e1f0 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1e200 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1e210 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
1e220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e230 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
1e240 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
1e250 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
1e260 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
1e270 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
1e280 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
1e290 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
1e2b0 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
1e2c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e2d0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1e2e0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
1e2f0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e300 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
1e310 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
1e320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e330 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1e340 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
1e350 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1e360 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1e370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1e380 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1e390 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1e3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1e3b0 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
1e3c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e3d0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
1e3e0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
1e3f0 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
1e400 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
1e410 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
1e420 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
1e430 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20   a factor of 3. 
1e440 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   Indexed range c
1e450 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63  onstraints reduc
1e460 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1e470 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1e480 65 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61  e by a larger fa
1e490 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b  ctor: 4.  We mak
1e4a0 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a  e indexed range.
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
1e4c0 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e  ore selective in
1e4d0 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61  tentionally beca
1e4e0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65  use of the subje
1e4f0 63 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20  ctive .         
1e500 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f     ** observatio
1e510 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72  n that indexed r
1e520 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1e530 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65   really are more
1e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e550 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61  selective in pra
1e560 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67  ctice, on averag
1e570 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1e580 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
1e590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e5a0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1e5b0 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
1e5c0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 20 20  NOOP ){.        
1e5d0 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65    /* Any other e
1e5e0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73  xpression lowers
1e5f0 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1e600 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f  count by half */
1e610 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20  .          nRow 
1e620 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 2;.        }.
1e630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e640 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20  ( nRow<2 ) nRow 
1e650 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  = 2;.    }...   
1e660 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1e670 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71      "%s(%s): nEq
1e680 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 65 73  =%d nInMul=%d es
1e690 74 42 6f 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d  tBound=%d bSort=
1e6a0 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73  %d bLookup=%d ws
1e6b0 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20  Flags=0x%x\n".  
1e6c0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f      "         no
1e6d0 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f  tReady=0x%llx lo
1e6e0 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25  g10N=%.1f nRow=%
1e6f0 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 20 75 73  .1f cost=%.1f us
1e700 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20  ed=0x%llx\n",.  
1e710 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e      pSrc->pTab->
1e720 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70  zName, (pIdx ? p
1e730 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1e740 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c  k"), .      nEq,
1e750 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42 6f 75 6e   nInMul, estBoun
1e760 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75  d, bSort, bLooku
1e770 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20 20 20  p, wsFlags,.    
1e780 20 20 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31    notReady, log1
1e790 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20  0N, nRow, cost, 
1e7a0 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20  used.    ));..  
1e7b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1e7c0 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ex is the best w
1e7d0 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66  e have seen so f
1e7e0 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  ar, then record 
1e7f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65  this.    ** inde
1e800 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  x and its cost i
1e810 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74 72 75  n the pCost stru
1e820 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
1e830 20 20 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20    if( (!pIdx || 
1e840 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20 26 26  wsFlags).     &&
1e850 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43   (cost<pCost->rC
1e860 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43  ost || (cost<=pC
1e870 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52  ost->rCost && nR
1e880 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  ow<pCost->plan.n
1e890 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  Row)).    ){.   
1e8a0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
1e8b0 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
1e8c0 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64  ost->used = used
1e8d0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
1e8e0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  lan.nRow = nRow;
1e8f0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
1e900 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28 77 73  an.wsFlags = (ws
1e910 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61 73 6b  Flags&wsFlagMask
1e920 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
1e930 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a  plan.nEq = nEq;.
1e940 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1e950 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
1e960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1e970 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1e980 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1e990 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
1e9a0 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
1e9b0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
1e9c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1e9d0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
1e9e0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20  ;..    /* Reset 
1e9f0 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65  masks for the ne
1ea00 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  xt index in the 
1ea10 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c  loop */.    wsFl
1ea20 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
1ea30 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
1ea40 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
1ea50 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
1ea60 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
1ea70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
1ea80 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
1ea90 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 53  clause and the S
1eaa0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
1eab0 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  er flag.  ** is 
1eac0 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73  set, then revers
1ead0 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74  e the order that
1eae0 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
1eaf0 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20  be scanned.  ** 
1eb00 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  in. This is used
1eb10 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   for application
1eb20 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c   testing, to hel
1eb30 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a  p find cases.  *
1eb40 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61 74  * where applicat
1eb50 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65  ion behaviour de
1eb60 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e  pends on the (un
1eb70 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74  defined) order t
1eb80 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hat.  ** SQLite 
1eb90 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
1eba0 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  in the absence o
1ebb0 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  f an ORDER BY cl
1ebc0 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
1ebd0 21 70 4f 72 64 65 72 42 79 20 26 26 20 70 50 61  !pOrderBy && pPa
1ebe0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1ebf0 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1ec00 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43 6f 73  rder ){.    pCos
1ec10 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1ec20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
1ec30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1ec40 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 43   pOrderBy || (pC
1ec50 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1ec60 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
1ec70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1ec80 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1ec90 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74  Idx==0 || (pCost
1eca0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1ecb0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d  HERE_ROWID_EQ)==
1ecc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ecd0 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
1ece0 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d         || pCost-
1ecf0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
1ed00 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74  .       || pCost
1ed10 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  ->plan.u.pIdx==p
1ed20 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29  Src->pIndex .  )
1ed30 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
1ed40 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a  ("best index is:
1ed50 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70   %s\n", .    ((p
1ed60 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1ed70 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1ed80 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e  ULLSCAN)==0 ? "n
1ed90 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20 20 20  one" : .        
1eda0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1edb0 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61  Idx ? pCost->pla
1edc0 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  n.u.pIdx->zName 
1edd0 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20  : "ipk").  ));. 
1ede0 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65   .  bestOrClause
1edf0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1ee00 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1ee10 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1ee20 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20  derBy, pCost);. 
1ee30 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
1ee40 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1ee50 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1ee60 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74   pCost);.  pCost
1ee70 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
1ee80 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a  = eqTermMask;.}.
1ee90 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1eea0 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
1eeb0 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20 70  ccessing table p
1eec0 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74 65  Src->pTab. Write
1eed0 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
1eee0 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
1eef0 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68  cost into the Wh
1ef00 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73  ereCost object s
1ef10 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74  upplied .** as t
1ef20 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  he last paramete
1ef30 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1ef40 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20 74   may calculate t
1ef50 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f  he cost of.** bo
1ef60 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72 74  th real and virt
1ef70 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ual table scans.
1ef80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ef90 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
1efa0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1efb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1efc0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1efd0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1efe0 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
1eff0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1f000 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1f010 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f020 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
1f030 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1f040 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
1f050 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
1f060 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1f070 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20   of cursors not 
1f080 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e  available for in
1f090 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
1f0a0 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
1f0b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1f0c0 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
1f0d0 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
1f0e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1f0f0 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
1f100 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1f110 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
1f120 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
1f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
1f140 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
1f150 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  lan */.){.#ifnde
1f160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1f170 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
1f180 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d   IsVirtual(pSrc-
1f190 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
1f1a0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1f1b0 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73   *p = 0;.    bes
1f1c0 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
1f1d0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1f1e0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
1f1f0 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  lid, pOrderBy, p
1f200 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20 69 66  Cost,&p);.    if
1f210 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1f220 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73  dxStr ){.      s
1f230 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69  qlite3_free(p->i
1f240 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dxStr);.    }.  
1f250 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f260 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1f270 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1f280 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65   {.    bestBtree
1f290 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1f2a0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1f2b0 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1f2c0 64 65 72 42 79 2c 20 30 2c 20 70 43 6f 73 74 29  derBy, 0, pCost)
1f2d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1f2e0 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
1f2f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f300 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
1f310 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
1f320 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
1f330 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
1f340 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
1f350 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
1f360 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
1f370 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1f380 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
1f390 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
1f3a0 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
1f3b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
1f3c0 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
1f3d0 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
1f3e0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f3f0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
1f400 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
1f410 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
1f420 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
1f430 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
1f440 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
1f450 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
1f460 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
1f470 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
1f480 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
1f490 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
1f4a0 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
1f4b0 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
1f4c0 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
1f4d0 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
1f4e0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
1f4f0 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
1f500 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
1f510 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
1f520 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
1f530 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
1f540 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
1f550 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  isabled..**.** I
1f560 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1f570 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20  : R-24597-58655 
1f580 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e  No tests are don
1f590 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74  e for terms that
1f5a0 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65   are.** complete
1f5b0 6c 79 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ly satisfied by 
1f5c0 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44  indices..**.** D
1f5d0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
1f5e0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
1f5f0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
1f600 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
1f610 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
1f620 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
1f630 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
1f640 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
1f650 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
1f660 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
1f670 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
1f680 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
1f690 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
1f6a0 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
1f6b0 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
1f6c0 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
1f6d0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
1f6e0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
1f6f0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
1f700 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1f710 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
1f720 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
1f730 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
1f740 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
1f750 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
1f760 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
1f770 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
1f780 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
1f790 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
1f7a0 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
1f7b0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
1f7c0 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
1f7d0 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
1f7e0 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
1f7f0 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
1f800 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1f810 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
1f820 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
1f830 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
1f840 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
1f850 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
1f860 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
1f870 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
1f880 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
1f890 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
1f8a0 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
1f8b0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1f8c0 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
1f8d0 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
1f8e0 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
1f8f0 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
1f900 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
1f910 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
1f920 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
1f930 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1f940 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
1f950 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
1f960 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
1f970 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
1f980 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
1f990 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
1f9a0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
1f9b0 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
1f9c0 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
1f9d0 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
1f9e0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
1f9f0 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
1fa00 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
1fa10 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
1fa20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
1fa30 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
1fa40 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
1fa50 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1fa60 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
1fa70 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
1fa80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fa90 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
1faa0 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
1fab0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1fac0 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
1fad0 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
1fae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1faf0 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
1fb00 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
1fb10 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
1fb20 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
1fb30 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
1fb40 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
1fb50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1fb60 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
1fb70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1fb80 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1fb90 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1fba0 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
1fbb0 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
1fbc0 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
1fbd0 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
1fbe0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
1fbf0 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
1fc00 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
1fc10 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
1fc20 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
1fc30 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
1fc40 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
1fc50 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1fc60 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
1fc70 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
1fc80 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
1fc90 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
1fca0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1fcb0 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
1fcc0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
1fcd0 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
1fce0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
1fcf0 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
1fd00 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
1fd10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fd20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
1fd30 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
1fd40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fd50 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
1fd60 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
1fd70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1fd80 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1fd90 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
1fda0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
1fdb0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1fdc0 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
1fdd0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1fde0 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
1fdf0 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
1fe00 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
1fe10 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
1fe20 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
1fe30 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
1fe40 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
1fe50 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1fe60 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
1fe70 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
1fe80 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
1fe90 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
1fea0 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
1feb0 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
1fec0 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
1fed0 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
1fee0 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
1fef0 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
1ff00 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
1ff10 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
1ff20 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
1ff30 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
1ff40 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
1ff50 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
1ff60 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
1ff70 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
1ff80 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
1ff90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ffa0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1ffb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1ffc0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
1ffd0 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
1ffe0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1fff0 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
20000 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
20010 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c  Level, /* When l
20020 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
20030 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
20040 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
20050 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
20060 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
20070 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
20080 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
20090 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
200a0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
200b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
200c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
200d0 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
200e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
200f0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
20100 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
20110 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
20120 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
20130 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20  _EQ ){.    iReg 
20140 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20150 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
20160 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pX->pRight, iTar
20170 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  get);.  }else if
20180 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  ( pX->op==TK_ISN
20190 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20  ULL ){.    iReg 
201a0 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73  = iTarget;.    s
201b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
201c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
201d0 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  iReg);.#ifndef S
201e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
201f0 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
20200 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
20210 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74  int iTab;.    st
20220 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
20230 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
20240 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
20250 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
20260 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
20270 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
20280 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
20290 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58  );.    iTab = pX
202a0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
202b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
202c0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
202d0 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
202e0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
202f0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20300 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20  _IN_ABLE );.    
20310 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
20320 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
20330 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
20340 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
20350 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
20360 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
20370 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
20380 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
20390 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
203a0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
203b0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
203c0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
203d0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203f0 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
20400 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
20410 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
20420 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
20430 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
20440 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
20450 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
20460 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
20470 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
20480 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
20490 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
204a0 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
204b0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
204c0 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
204d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
204e0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
204f0 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
20500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
20510 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
20520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
20530 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
20540 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
20550 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20560 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
20570 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
20580 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20590 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
205a0 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
205b0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
205c0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
205d0 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
205e0 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
205f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
20600 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
20610 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
20620 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
20630 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a  an.** index..**.
20640 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
20650 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74  consider table t
20660 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77  1(a,b,c,d,e,f) w
20670 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62  ith index i1(a,b
20680 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ,c)..** Suppose 
20690 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
206a0 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20   is this:  a==5 
206b0 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  AND b IN (1,2,3)
206c0 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31   AND c>5 AND c<1
206d0 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68  0.** The index h
206e0 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68  as as many as th
206f0 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ree equality con
20700 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e  straints, but in
20710 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65   this.** example
20720 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20  , the third "c" 
20730 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71  value is an ineq
20740 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79  uality.  So only
20750 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61   two .** constra
20760 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20  ints are coded. 
20770 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
20780 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  ll generate code
20790 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
207a0 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31  a==5 and b IN (1
207b0 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72  ,2,3).  The curr
207c0 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61  ent values for a
207d0 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73   and b will be s
207e0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73  tored.** in cons
207f0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
20800 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
20810 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67  of the first reg
20820 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
20830 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  d..**.** In the 
20840 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
20850 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
20860 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
20870 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
20880 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
20890 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
208a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
208b0 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
208c0 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
208d0 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
208e0 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
208f0 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
20900 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70  cell and.** comp
20910 75 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ute the affinity
20920 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
20930 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
20940 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
20950 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
20960 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e   cell and return
20970 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f  s.** the index o
20980 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
20990 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ll. The code tha
209a0 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
209b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
209c0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
209d0 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  l to store the t
209e0 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65  ermination.** ke
209f0 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  y value of the l
20a00 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  oop.  If one or 
20a10 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  more IN operator
20a20 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a  s appear, then.*
20a30 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * this routine a
20a40 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69  llocates an addi
20a50 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72  tional nEq memor
20a60 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65  y cells for inte
20a70 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a  rnal.** use..**.
20a80 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
20a90 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73  ing, *pzAff is s
20aa0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
20ab0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
20ac0 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  ng a.** copy of 
20ad0 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
20ae0 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68  ity string of th
20af0 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65  e index allocate
20b00 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  d using.** sqlit
20b10 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78  e3DbMalloc(). Ex
20b20 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e  cept, entries in
20b30 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
20b40 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
20b50 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c  ed.** with equal
20b60 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
20b70 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66  that use NONE af
20b80 66 69 6e 69 74 79 20 61 72 65 20 73 65 74 20 74  finity are set t
20b90 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  o.** SQLITE_AFF_
20ba0 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f  NONE. This is to
20bb0 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73   deal with SQL s
20bc0 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
20bd0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  wing:.**.**   CR
20be0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
20bf0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
20c00 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , b);.**   SELEC
20c10 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53  T ... FROM t1 AS
20c20 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74 31   t2, t1 WHERE t1
20c30 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a  .a = t2.b;.**.**
20c40 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
20c50 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78  above, the index
20c60 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20 54 45   on t1(a) has TE
20c70 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74  XT affinity. But
20c80 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69   since.** the ri
20c90 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  ght hand side of
20ca0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
20cb0 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20  nstraint (t2.b) 
20cc0 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  has NONE affinit
20cd0 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73  y,.** no convers
20ce0 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ion should be at
20cf0 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75  tempted before u
20d00 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75  sing a t2.b valu
20d10 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  e as part of.** 
20d20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20  a key to search 
20d30 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65  the index. Hence
20d40 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
20d50 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  in the returned 
20d60 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
20d70 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70  ng in this examp
20d80 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20  le would be set 
20d90 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  to SQLITE_AFF_NO
20da0 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NE..*/.static in
20db0 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  t codeAllEqualit
20dc0 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  yTerms(.  Parse 
20dd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
20de0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20df0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  xt */.  WhereLev
20e00 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a  el *pLevel,   /*
20e10 20 57 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f   Which nested lo
20e20 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77  op of the FROM w
20e30 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a  e are coding */.
20e40 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
20e50 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
20e60 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
20e70 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
20e80 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  y,     /* Which 
20e90 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61  parts of FROM ha
20ea0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
20eb0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  coded */.  int n
20ec0 45 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20  ExtraReg,       
20ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
20ee0 74 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f  tra registers to
20ef0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
20f00 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20  har **pzAff     
20f10 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
20f20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66   to point to aff
20f30 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
20f40 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  ){.  int nEq = p
20f50 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b  Level->plan.nEq;
20f60 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
20f70 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
20f80 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65  straints to code
20f90 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
20fa0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
20fb0 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e      /* The vm un
20fc0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
20fd0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
20fe0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
20ff0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
21000 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
21010 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
21020 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c  nt iCur = pLevel
21030 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20  ->iTabCur;   /* 
21040 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
21050 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
21060 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
21070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
21080 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
21090 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
210a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
210b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
210c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
210d0 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210f0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f  Base register */
21100 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20  .  int nReg;    
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
21130 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
21140 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ate */.  char *z
21150 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
21160 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
21170 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74  ty string to ret
21180 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  urn */..  /* Thi
21190 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79  s module is only
211a0 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79   called on query
211b0 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20   plans that use 
211c0 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61  an index. */.  a
211d0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
211e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
211f0 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
21200 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
21210 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20  plan.u.pIdx;..  
21220 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
21230 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
21240 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
21250 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
21260 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42  hem..  */.  regB
21270 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
21280 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d  em + 1;.  nReg =
21290 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
212a0 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20  q + nExtraReg;. 
212b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
212c0 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d   nReg;..  zAff =
212d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
212e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c  (pParse->db, sql
212f0 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
21300 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a  yStr(v, pIdx));.
21310 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20    if( !zAff ){. 
21320 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
21330 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
21340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75  .  }..  /* Evalu
21350 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
21360 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
21370 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
21380 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29  ->nColumn>=nEq )
21390 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e  ;.  for(j=0; j<n
213a0 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
213b0 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20  t r1;.    int k 
213c0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
213d0 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  [j];.    pTerm =
213e0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
213f0 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
21400 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  , pLevel->plan.w
21410 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20  sFlags, pIdx);. 
21420 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 65     if( NEVER(pTe
21430 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a  rm==0) ) break;.
21440 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
21450 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e  wing true for in
21460 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75 6e  dices with redun
21470 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20  dant columns. . 
21480 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45     ** Ex: CREATE
21490 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
214a0 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a  a,b,a); SELECT *
214b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
214c0 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20  =0 AND b=0; */. 
214d0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 54     testcase( (pT
214e0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
214f0 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b  ERM_CODED)!=0 );
21500 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21510 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
21520 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
21530 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
21540 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d  1662 */.    r1 =
21550 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
21560 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
21570 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
21580 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
21590 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
215a0 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
215b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
215c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
215d0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
215e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
215f0 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
21600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21620 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
21630 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
21640 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
21650 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21660 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
21670 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
21680 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
21690 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
216a0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
216b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
216c0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
216d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
216e0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
216f0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
21700 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
21710 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
21720 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
21730 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
21740 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
21750 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
21760 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21770 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21780 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
21790 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
217a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
217b0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
217c0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
217d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
217e0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
217f0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
21800 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
21810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
21820 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
21830 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
21840 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21850 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
21860 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
21870 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e  regBase;.}..#ifn
21880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21890 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68  EXPLAIN./*.** Th
218a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
218b0 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61  helper for expla
218c0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62  inIndexRange() b
218d0 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20  elow.**.** pStr 
218e0 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f  holds the text o
218f0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
21900 74 68 61 74 20 77 65 20 61 72 65 20 62 75 69 6c  that we are buil
21910 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d  ding up one term
21920 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20  .** at a time.  
21930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
21940 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  s a new term to 
21950 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65  the end of the e
21960 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65  xpression..** Te
21970 72 6d 73 20 61 72 65 20 73 65 70 61 72 61 74 65  rms are separate
21980 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20  d by AND so add 
21990 74 68 65 20 22 41 4e 44 22 20 74 65 78 74 20 66  the "AND" text f
219a0 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75  or second and su
219b0 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d  bsequent.** term
219c0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
219d0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70  c void explainAp
219e0 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41  pendTerm(.  StrA
219f0 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20  ccum *pStr,     
21a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
21a10 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ext expression b
21a20 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20  eing built */.  
21a30 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20  int iTerm,      
21a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21a50 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74 65 72  ndex of this ter
21a60 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a 65 72  m.  First is zer
21a70 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  o */.  const cha
21a80 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  r *zColumn,     
21a90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21aa0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
21ab0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20  nst char *zOp   
21ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21ad0 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
21ae0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54  r */.){.  if( iT
21af0 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72  erm ) sqlite3Str
21b00 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
21b10 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20  , " AND ", 5);. 
21b20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21b30 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f  Append(pStr, zCo
21b40 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c  lumn, -1);.  sql
21b50 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
21b60 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29  nd(pStr, zOp, 1)
21b70 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
21b80 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
21b90 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  "?", 1);.}../*.*
21ba0 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65  * Argument pLeve
21bb0 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73 74  l describes a st
21bc0 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e  rategy for scann
21bd0 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ing table pTab. 
21be0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
21bf0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
21c00 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
21c10 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
21c20 67 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  g a description.
21c30 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73 65 74  ** of the subset
21c40 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73   of table rows s
21c50 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74  canned by the st
21c60 72 61 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f  rategy in the fo
21c70 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20  rm of an.** SQL 
21c80 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20  expression. Or, 
21c90 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
21ca0 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73  scanned, NULL is
21cb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
21cc0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
21cd0 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a   the query:.**.*
21ce0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
21cf0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 20 41  M t1 WHERE a=1 A
21d00 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73  ND b>2;.**.** is
21d10 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69   run and there i
21d20 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  s an index on (a
21d30 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20  , b), then this 
21d40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
21d50 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d   a.** string sim
21d60 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
21d70 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a   "a=? AND b>?".*
21d80 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
21d90 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  d pointer points
21da0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
21db0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
21dc0 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  DbMalloc()..** I
21dd0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
21de0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
21df0 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
21e00 65 20 62 75 66 66 65 72 20 77 68 65 6e 20 69 74  e buffer when it
21e10 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
21e20 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
21e30 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61  atic char *expla
21e40 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c  inIndexRange(sql
21e50 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
21e60 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61  evel *pLevel, Ta
21e70 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68  ble *pTab){.  Wh
21e80 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d  erePlan *pPlan =
21e90 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a   &pLevel->plan;.
21ea0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
21eb0 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b  = pPlan->u.pIdx;
21ec0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c  .  int nEq = pPl
21ed0 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69  an->nEq;.  int i
21ee0 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  , j;.  Column *a
21ef0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
21f00 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d  ;.  int *aiColum
21f10 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  n = pIndex->aiCo
21f20 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d  lumn;.  StrAccum
21f30 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71   txt;..  if( nEq
21f40 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77  ==0 && (pPlan->w
21f50 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
21f60 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
21f70 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29  TOP_LIMIT))==0 )
21f80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
21f90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
21fa0 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20  AccumInit(&txt, 
21fb0 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58  0, 0, SQLITE_MAX
21fc0 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e  _LENGTH);.  txt.
21fd0 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74  db = db;.  sqlit
21fe0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
21ff0 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b  (&txt, " (", 2);
22000 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45  .  for(i=0; i<nE
22010 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70  q; i++){.    exp
22020 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
22030 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
22040 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[i]].zName,
22050 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20   "=");.  }..  j 
22060 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e  = i;.  if( pPlan
22070 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
22080 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
22090 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
220a0 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 61 43  rm(&txt, i++, aC
220b0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
220c0 7a 4e 61 6d 65 2c 20 22 3e 22 29 3b 0a 20 20 7d  zName, ">");.  }
220d0 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73  .  if( pPlan->ws
220e0 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  Flags&WHERE_TOP_
220f0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70  LIMIT ){.    exp
22100 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
22110 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43  txt, i, aCol[aiC
22120 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c  olumn[j]].zName,
22130 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   "<");.  }.  sql
22140 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
22150 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29  nd(&txt, ")", 1)
22160 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
22170 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
22180 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&txt);.}../*.**
22190 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
221a0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
221b0 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
221c0 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e  ssing an EXPLAIN
221d0 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63   QUERY PLAN.** c
221e0 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71  ommand. If the q
221f0 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69  uery being compi
22200 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49  led is an EXPLAI
22210 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20  N QUERY PLAN, a 
22220 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64  single.** record
22230 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
22240 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72   output to descr
22250 69 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63  ibe the table sc
22260 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a  an strategy in .
22270 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ** pLevel..*/.st
22280 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
22290 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
222a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
222b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
222c0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
222d0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
222e0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
222f0 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
22300 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
22310 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
22320 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
22330 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
22340 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
22350 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
22360 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
22390 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
223a0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
223b0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
223e0 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
223f0 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
22400 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
22410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
22420 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
22430 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
22440 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
22450 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
22460 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73  ){.    u32 flags
22470 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
22480 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72  wsFlags;.    str
22490 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
224a0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
224b0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
224c0 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20  From];.    Vdbe 
224d0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
224e0 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62  be;      /* VM b
224f0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
22500 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20   */.    sqlite3 
22510 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
22520 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
22530 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  e handle */.    
22540 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20  char *zMsg;     
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22560 20 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20   Text to add to 
22570 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
22580 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22590 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
225a0 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
225b0 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
225c0 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20  ed by scan */.  
225d0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72    int iId = pPar
225e0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20  se->iSelectId;  
225f0 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65  /* Select id (le
22600 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63  ft-most output c
22610 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  olumn) */.    in
22620 74 20 69 73 53 65 61 72 63 68 3b 20 20 20 20 20  t isSearch;     
22630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22640 72 75 65 20 66 6f 72 20 61 20 53 45 41 52 43 48  rue for a SEARCH
22650 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e  . False for SCAN
22660 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66  . */..    if( (f
22670 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49  lags&WHERE_MULTI
22680 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c  _OR) || (wctrlFl
22690 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42  ags&WHERE_ONETAB
226a0 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  LE_ONLY) ) retur
226b0 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68  n;..    isSearch
226c0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
226d0 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20  .nEq>0).        
226e0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28       || (flags&(
226f0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
22700 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
22710 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
22720 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
22730 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
22740 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
22750 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
22760 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
22770 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
22780 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
22790 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
227a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
227b0 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
227c0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
227d0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
227e0 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
227f0 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
22800 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
22810 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
22820 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
22830 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
22840 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
22850 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
22860 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
22870 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
22880 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
22890 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
228a0 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
228b0 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
228c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
228d0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
228e0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
228f0 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
22900 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  e = explainIndex
22910 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c  Range(db, pLevel
22920 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
22930 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22940 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
22950 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47   zMsg, "%s USING
22960 20 25 73 25 73 49 4e 44 45 58 25 73 25 73 25 73   %s%sINDEX%s%s%s
22970 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20  ", zMsg, .      
22980 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
22990 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
229a0 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29  "AUTOMATIC ":"")
229b0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
229c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
229d0 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20  ONLY)?"COVERING 
229e0 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  ":""),.         
229f0 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45   ((flags & WHERE
22a00 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a  _TEMP_INDEX)?"":
22a10 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  " "),.          
22a20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
22a30 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20  TEMP_INDEX)?"": 
22a40 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
22a50 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  Idx->zName),.   
22a60 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20         zWhere.  
22a70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
22a80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
22a90 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Where);.    }els
22aa0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 57  e if( flags & (W
22ab0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
22ac0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
22ad0 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
22ae0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
22af0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
22b00 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
22b10 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
22b20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ;..      if( fla
22b30 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
22b40 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Q ){.        zMs
22b50 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22b60 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22b70 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d  s (rowid=?)", zM
22b80 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
22b90 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
22ba0 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57  E_BOTH_LIMIT)==W
22bb0 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20  HERE_BOTH_LIMIT 
22bc0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22bd0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22be0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22bf0 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77  (rowid>? AND row
22c00 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
22c10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
22c20 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c  lags&WHERE_BTM_L
22c30 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
22c40 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
22c50 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
22c60 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c   "%s (rowid>?)",
22c70 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
22c80 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
22c90 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
22ca0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
22cb0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22cc0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
22cd0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
22ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
22cf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22d00 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
22d10 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
22d20 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
22d30 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
22d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
22d50 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
22d60 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
22d70 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20  n.u.pVtabIdx;.  
22d80 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22d90 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22da0 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
22db0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
22dc0 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
22de0 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70  abIdx->idxNum, p
22df0 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29  VtabIdx->idxStr)
22e00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22e10 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67     if( wctrlFlag
22e20 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
22e30 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
22e40 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20  BY_MAX) ){.     
22e50 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c   testcase( wctrl
22e60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
22e70 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20  DERBY_MIN );.   
22e80 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20     nRow = 1;.   
22e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
22ea0 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  ow = (sqlite3_in
22eb0 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  t64)pLevel->plan
22ec0 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20  .nRow;.    }.   
22ed0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22ee0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22ef0 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77  , "%s (~%lld row
22f00 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29  s)", zMsg, nRow)
22f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22f20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
22f30 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
22f40 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
22f50 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
22f60 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
22f70 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ne explainOneSca
22f80 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  n(u,v,w,x,y,z).#
22f90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22fa0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
22fb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22fc0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74   code for the st
22fd0 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65  art of the iLeve
22fe0 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65  l-th loop in the
22ff0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
23000 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
23010 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49  described by pWI
23020 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  nfo..*/.static B
23030 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f  itmask codeOneLo
23040 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65  opStart(.  Where
23050 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
23060 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f  /* Complete info
23070 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
23080 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
23090 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
230a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
230b0 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66  h level of pWInf
230c0 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65  o->a[] should be
230d0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20   coded */.  u16 
230e0 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
230f0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
23100 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66  HERE_* flags def
23110 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
23120 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  t.h */.  Bitmask
23130 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a   notReady     /*
23140 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   Which tables ar
23150 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  e currently avai
23160 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lable */.){.  in
23170 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  t j, k;         
23180 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
23190 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ers */.  int iCu
231a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
231b0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
231c0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
231d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b  /.  int addrNxt;
231e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
231f0 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
23200 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
23210 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
23220 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
23230 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
23240 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
23250 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  x only */.  int 
23260 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
23270 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
23280 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
23290 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
232a0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
232b0 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68  evel;  /* The wh
232c0 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20  ere level to be 
232d0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
232e0 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
232f0 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
23300 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57   of the entire W
23310 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
23320 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
23330 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23340 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75   /* A WHERE clau
23350 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72  se term */.  Par
23360 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23380 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23390 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
233c0 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20  ared stmt under 
233d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f  constructions */
233e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
233f0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
23400 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73  ;  /* FROM claus
23410 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64  e term being cod
23420 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
23430 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Brk;            
23440 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
23450 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
23460 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  t of the loop */
23470 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b  .  int addrCont;
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
234a0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
234b0 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
234c0 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d   int iRowidReg =
234d0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f   0;        /* Ro
234e0 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  wid is stored in
234f0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20   this register, 
23500 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20  if not zero */. 
23510 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67   int iReleaseReg
23520 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65   = 0;      /* Te
23530 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
23540 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ree before retur
23550 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73  ning */..  pPars
23560 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
23570 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  se;.  v = pParse
23580 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d  ->pVdbe;.  pWC =
23590 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20   pWInfo->pWC;.  
235a0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
235b0 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70  ->a[iLevel];.  p
235c0 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
235d0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
235e0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
235f0 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
23600 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65  ->iCursor;.  bRe
23610 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  v = (pLevel->pla
23620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
23630 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20  E_REVERSE)!=0;. 
23640 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
23650 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
23660 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
23670 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20  NLY)!=0 .       
23680 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61      && (wctrlFla
23690 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45  gs & WHERE_FORCE
236a0 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f  _TABLE)==0;..  /
236b0 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
236c0 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
236d0 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
236e0 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
236f0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
23700 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
23710 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b  addrBrk to break
23720 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
23730 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
23740 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
23750 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
23760 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
23770 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  .  ** loop..  **
23780 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65  .  ** When there
23790 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
237a0 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  or, we also have
237b0 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62   a "addrNxt" lab
237c0 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61  el that.  ** mea
237d0 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
237e0 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
237f0 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
23800 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68  n.  When.  ** th
23810 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70  ere are no IN op
23820 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63  erators in the c
23830 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20  onstraints, the 
23840 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a  "addrNxt" label.
23850 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
23860 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20   as "addrBrk".. 
23870 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20   */.  addrBrk = 
23880 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20  pLevel->addrBrk 
23890 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
238a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
238b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61  akeLabel(v);.  a
238c0 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c  ddrCont = pLevel
238d0 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c  ->addrCont = sql
238e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
238f0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  l(v);..  /* If t
23900 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
23910 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
23920 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
23930 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69  ocate and.  ** i
23940 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f  nitialize a memo
23950 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63  ry cell that rec
23960 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62  ords if this tab
23970 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20  le matches any. 
23980 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
23990 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
239a0 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
239b0 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e  ( pLevel->iFrom>
239c0 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30  0 && (pTabItem[0
239d0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
239e0 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
239f0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23a00 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
23a10 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
23a20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23a30 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76  Integer, 0, pLev
23a40 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
23a50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
23a60 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
23a70 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
23a80 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  g"));.  }..#ifnd
23a90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
23aa0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
23ab0 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  (  (pLevel->plan
23ac0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
23ad0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
23ae0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  0 ){.    /* Case
23af0 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   0:  The table i
23b00 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
23b10 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
23b20 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
23b30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
23b40 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
23b50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
23b60 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56   iReg;   /* P3 V
23b70 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c  alue for OP_VFil
23b80 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ter */.    sqlit
23b90 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
23ba0 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
23bb0 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
23bc0 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  x;.    int nCons
23bd0 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64  traint = pVtabId
23be0 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->nConstraint;.
23bf0 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
23c00 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
23c10 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
23c20 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43      pVtabIdx->aC
23c60 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
23c70 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
23c80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
23c90 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
23ca0 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cd0 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
23ce0 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
23cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23d00 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
23d10 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  );.    iReg = sq
23d20 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
23d30 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
23d40 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f  raint+2);.    fo
23d50 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74  r(j=1; j<=nConst
23d60 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
23d70 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43     for(k=0; k<nC
23d80 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b  onstraint; k++){
23d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73  .        if( aUs
23da0 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78  age[k].argvIndex
23db0 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==j ){.         
23dc0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
23dd0 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72  nstraint[k].iTer
23de0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
23df0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
23e00 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e  de(pParse, pWC->
23e10 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
23e20 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31  pRight, iReg+j+1
23e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
23e40 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
23e50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23e60 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  k==nConstraint )
23e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23e90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23ea0 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  r, pVtabIdx->idx
23eb0 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
23ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23ed0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
23ee0 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20   j-1, iReg+1);. 
23ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23f00 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
23f10 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  er, iCur, addrBr
23f20 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  k, iReg, pVtabId
23f30 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
23f60 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
23f70 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
23f80 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
23f90 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
23fa0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
23fb0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
23fc0 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
23fd0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
23fe0 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
23ff0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
24000 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
24010 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
24020 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
24030 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
24040 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
24050 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
24060 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
24070 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
24080 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
24090 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
240a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
240b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
240c0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
240d0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
240e0 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
240f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24100 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
24110 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
24120 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
24130 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
24140 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
24150 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
24160 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
24170 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65    /* Case 1:  We
24180 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
24190 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
241a0 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
241b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
241c0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
241d0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
241e0 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
241f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
24200 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
24210 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
24220 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
24230 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  )".    **       
24240 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20     construct..  
24250 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73    */.    iReleas
24260 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
24270 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24280 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
24290 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
242a0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
242b0 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
242c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
242d0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
242e0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
242f0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
24300 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  rt( pTerm->leftC
24310 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
24320 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
24330 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74  able==0 );.    t
24340 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
24350 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
24360 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
24370 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
24380 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67 20  /.    iRowidReg 
24390 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
243a0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
243b0 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61  , pLevel, iRelea
243c0 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72  seReg);.    addr
243d0 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
243e0 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  drNxt;.    sqlit
243f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24400 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52  OP_MustBeInt, iR
24410 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74  owidReg, addrNxt
24420 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
24430 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
24440 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
24450 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52  addrNxt, iRowidR
24460 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
24470 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
24480 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
24490 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
244a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
244b0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65   "pk"));.    pLe
244c0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
244d0 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  p;.  }else if( p
244e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
244f0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
24500 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f  D_RANGE ){.    /
24510 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
24520 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
24530 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
24540 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
24550 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eld..    */.    
24560 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
24570 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74  Noop;.    int st
24580 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  art;.    int mem
24590 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  EndValue = 0;.  
245a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
245b0 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
245c0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
245d0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74  le==0 );.    pSt
245e0 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  art = findTerm(p
245f0 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
24600 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
24610 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e  _GE, 0);.    pEn
24620 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  d = findTerm(pWC
24630 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
24640 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
24650 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  E, 0);.    if( b
24660 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65  Rev ){.      pTe
24670 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
24680 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
24690 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70  ;.      pEnd = p
246a0 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Term;.    }.    
246b0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
246c0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
246d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
246e0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
246f0 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74 61   defines the sta
24700 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  rt bound */.    
24710 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b    int r1, rTemp;
24720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
24730 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67  ters for holding
24740 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
24750 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ary */..      /*
24760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24770 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f  onstant maps TK_
24780 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f  xx codes into co
24790 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20  rresponding .   
247a0 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64     ** seek opcod
247b0 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20  es.  It depends 
247c0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
247d0 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78  ordering of TK_x
247e0 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  x.      */.     
247f0 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f   const u8 aMoveO
24800 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
24810 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20     /* TK_GT */  
24820 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20  OP_SeekGt,.     
24830 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a        /* TK_LE *
24840 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20  /  OP_SeekLe,.  
24850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
24860 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c  T */  OP_SeekLt,
24870 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
24880 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GE */  OP_Seek
24890 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  Ge.      };.    
248a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
248b0 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20  =TK_GT+1 );     
248c0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
248d0 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a  e ordering.. */.
248e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
248f0 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20  _LT==TK_GT+2 ); 
24900 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20       /*  ... of 
24910 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73  the TK_xx values
24920 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ... */.      ass
24930 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47  ert( TK_GE==TK_G
24940 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+3 );      /*  
24950 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e  ... is correcct.
24960 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
24970 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
24980 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
24990 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
249a0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
249b0 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74       pX = pStart
249c0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
249d0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
249e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
249f0 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
24a00 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
24a10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
24a20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
24a30 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54   pX->pRight, &rT
24a40 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
24a50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24a60 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d   aMoveOp[pX->op-
24a70 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64  TK_GT], iCur, ad
24a80 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20  drBrk, r1);.    
24a90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24aa0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
24ab0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24ac0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
24ad0 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20  Parse, r1, 1);. 
24ae0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
24af0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24b00 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  e, rTemp);.     
24b10 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
24b20 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  vel, pStart);.  
24b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
24b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24b50 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
24b60 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
24b70 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
24b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45      }.    if( pE
24b90 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
24ba0 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d   *pX;.      pX =
24bb0 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
24bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
24bd0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
24be0 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  t( pEnd->leftCur
24bf0 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
24c00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 6e     testcase( pEn
24c10 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
24c20 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
24c30 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
24c40 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e  2 */.      memEn
24c50 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73  dValue = ++pPars
24c60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
24c70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
24c80 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
24c90 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b  t, memEndValue);
24ca0 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f  .      if( pX->o
24cb0 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
24cc0 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
24cd0 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
24ce0 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
24cf0 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
24d00 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
24d10 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
24d20 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
24d30 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
24d40 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
24d50 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
24d60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
24d70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
24d80 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
24d90 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
24da0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
24db0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
24dc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
24dd0 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28 20   start;.    if( 
24de0 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e  pStart==0 && pEn
24df0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  d==0 ){.      pL
24e00 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
24e10 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
24e20 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
24e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
24e40 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
24e50 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
24e60 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
24e70 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f  oop ){.      iRo
24e80 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73  widReg = iReleas
24e90 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  eReg = sqlite3Ge
24ea0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
24eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24ec0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24ed0 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f  Rowid, iCur, iRo
24ee0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
24ef0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
24f00 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
24f10 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
24f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24f30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65  VdbeAddOp3(v, te
24f40 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  stOp, memEndValu
24f50 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77  e, addrBrk, iRow
24f60 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
24f70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
24f80 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  5(v, SQLITE_AFF_
24f90 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45  NUMERIC | SQLITE
24fa0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
24fb0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
24fc0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
24fd0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f  lags & (WHERE_CO
24fe0 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
24ff0 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20  _COLUMN_EQ) ){. 
25000 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20     /* Case 3: A 
25010 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
25020 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
25030 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57  **         The W
25040 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20  HERE clause may 
25050 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20  contain zero or 
25060 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20  more equality . 
25070 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
25080 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
25090 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
250a0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
250b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
250c0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
250d0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  s of the index. 
250e0 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  It may also cont
250f0 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ain.    **      
25100 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f     inequality co
25110 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c  nstraints (>, <,
25120 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68   >= or <=) on th
25130 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a  e indexed.    **
25140 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
25150 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  that immediately
25160 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65   follows the N e
25170 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20  qualities. Only 
25180 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25190 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
251a0 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
251b0 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
251c0 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a   rest must.    *
251d0 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
251e0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
251f0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
25200 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
25210 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
25220 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
25230 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
25240 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
25250 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20  re all .    **  
25260 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64         optimized
25270 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
25280 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20             x=5. 
25290 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
252a0 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20   x=5 AND y=10.  
252b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
252c0 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  x=5 AND y<10.   
252d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
252e0 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79  =5 AND y>5 AND y
252f0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
25300 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
25310 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
25320 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
25330 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20    The z<10 term 
25340 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
25350 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
25360 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
25370 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
25380 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m:.    **.    **
25390 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
253a0 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a  AND z<10.    **.
253b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e      **         N
253c0 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20   may be zero if 
253d0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
253e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
253f0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
25400 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
25410 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
25420 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
25430 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20  is at.    **    
25440 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
25450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
25460 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
25470 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
25480 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
25490 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
254a0 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  **         const
254b0 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e  raints but an in
254c0 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20  dex is selected 
254d0 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72  anyway, in order
254e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
254f0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
25500 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
25510 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
25520 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20   BY..    */  .  
25530 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
25540 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  8 aStartOp[] = {
25550 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
25560 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69  0,.      OP_Rewi
25570 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd,           /*
25580 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   2: (!start_cons
25590 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
255a0 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f  Eq &&  !bRev) */
255b0 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20  .      OP_Last, 
255c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
255d0 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
255e0 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
255f0 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20   &&   bRev) */. 
25600 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20       OP_SeekGt, 
25610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20            /* 4: 
25620 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
25630 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
25640 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
25650 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20     OP_SeekLt,   
25660 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73          /* 5: (s
25670 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
25680 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
25690 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
256a0 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20   OP_SeekGe,     
256b0 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
256c0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
256d0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
256e0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
256f0 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20  P_SeekLe        
25700 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
25710 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
25720 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
25730 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
25740 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
25750 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20  8 aEndOp[] = {. 
25760 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20       OP_Noop,   
25770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20            /* 0: 
25780 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74  (!end_constraint
25790 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  s) */.      OP_I
257a0 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
257b0 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 1: (end_cons
257c0 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
257d0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
257e0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
257f0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
25800 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
25810 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
25820 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
25830 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75  plan.nEq;  /* Nu
25840 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
25850 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e   terms */.    in
25860 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30  t isMinQuery = 0
25870 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
25880 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   this is an opti
25890 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e  mized SELECT min
258a0 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  (x).. */.    int
258b0 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
258c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
258d0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
258e0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61  ng constraint va
258f0 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
25900 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
25910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
25920 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
25930 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
25940 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
25950 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
25960 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
25970 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65  start */.    Whe
25980 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e  reTerm *pRangeEn
25990 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65  d = 0;    /* Ine
259a0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
259b0 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20  nt at range end 
259c0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
259d0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
259e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
259f0 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73 20  ange start uses 
25a00 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
25a10 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20      int endEq;  
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
25a40 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e  e end uses ==, >
25a50 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
25a60 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  nt start_constra
25a70 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53  ints;       /* S
25a80 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73  tart of range is
25a90 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a   constrained */.
25aa0 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61      int nConstra
25ab0 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
25ac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
25ad0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a  nstraint terms *
25ae0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
25af0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
25b00 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
25b10 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
25b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
25b30 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
25b40 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
25b50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
25b60 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
25b70 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20   nExtraReg = 0; 
25b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25b90 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
25ba0 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f  isters needed */
25bb0 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  .    int op;    
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
25be0 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63   opcode */.    c
25bf0 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20  har *zStartAff; 
25c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25c10 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72  ffinity for star
25c20 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  t of range const
25c30 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  raint */.    cha
25c40 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20  r *zEndAff;     
25c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
25c60 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66  inity for end of
25c70 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
25c80 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d  t */..    pIdx =
25c90 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
25ca0 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75  pIdx;.    iIdxCu
25cb0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
25cc0 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64  Cur;.    k = pId
25cd0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
25ce0 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ;     /* Column 
25cf0 66 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63  for inequality c
25d00 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20  onstraints */.. 
25d10 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f     /* If this lo
25d20 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73  op satisfies a s
25d30 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65  ort order (pOrde
25d40 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61  rBy) request tha
25d50 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61  t .    ** was pa
25d60 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
25d70 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65  ction to impleme
25d80 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  nt a "SELECT min
25d90 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a  (x) ..." .    **
25da0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65   query, then the
25db0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c   caller will onl
25dc0 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70  y allow the loop
25dd0 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20   to run for.    
25de0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72  ** a single iter
25df0 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ation. This mean
25e00 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  s that the first
25e10 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20   row returned.  
25e20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20    ** should not 
25e30 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75  have a NULL valu
25e40 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e  e stored in 'x'.
25e50 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69   If column 'x' i
25e60 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72  s.    ** the fir
25e70 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65  st one after the
25e80 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f   nEq equality co
25e90 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
25ea0 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74   index,.    ** t
25eb0 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d  his requires som
25ec0 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
25ed0 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ng..    */.    i
25ee0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  f( (wctrlFlags&W
25ef0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
25f00 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c  )!=0.     && (pL
25f10 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
25f20 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
25f30 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d  ).     && (pIdx-
25f40 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20  >nColumn>nEq).  
25f50 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73    ){.      /* as
25f60 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
25f70 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20  nExpr==1 ); */. 
25f80 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
25f90 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
25fa0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
25fb0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
25fc0 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69  q] ); */.      i
25fd0 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20  sMinQuery = 1;. 
25fe0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
25ff0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
26000 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75  * Find any inequ
26010 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
26020 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73   terms for the s
26030 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20  tart and end .  
26040 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67    ** of the rang
26050 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e. .    */.    i
26060 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
26070 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26080 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
26090 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66     pRangeEnd = f
260a0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
260b0 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
260c0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70  (WO_LT|WO_LE), p
260d0 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  Idx);.      nExt
260e0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
260f0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
26100 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
26110 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
26120 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53  ){.      pRangeS
26130 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
26140 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
26150 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57  tReady, (WO_GT|W
26160 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_GE), pIdx);.  
26170 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
26180 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
26190 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
261a0 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
261b0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
261c0 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
261d0 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
261e0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
261f0 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
26200 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
26210 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
26220 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20  ng at regBase.. 
26230 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73     */.    regBas
26240 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  e = codeAllEqual
26250 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20 20  ityTerms(.      
26260 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c    pParse, pLevel
26270 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c  , pWC, notReady,
26280 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53 74   nExtraReg, &zSt
26290 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20 20  artAff.    );.  
262a0 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69    zEndAff = sqli
262b0 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
262c0 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66  se->db, zStartAf
262d0 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  f);.    addrNxt 
262e0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
262f0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
26300 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
26310 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
26320 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
26330 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
26340 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
26350 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
26360 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
26370 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
26380 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
26390 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
263a0 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
263b0 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
263c0 20 69 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e 6e   if( nEq<pIdx->n
263d0 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d  Column && bRev==
263e0 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65  (pIdx->aSortOrde
263f0 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
26400 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20  O_ASC) ){.      
26410 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a  SWAP(WhereTerm *
26420 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61  , pRangeEnd, pRa
26430 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  ngeStart);.    }
26440 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ..    testcase( 
26450 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
26460 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
26470 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
26480 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
26490 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52  RangeStart && pR
264a0 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
264b0 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a  ator & WO_GE );.
264c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
264d0 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
264e0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
264f0 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74  & WO_LE );.    t
26500 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
26510 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d  nd && pRangeEnd-
26520 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
26530 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45  GE );.    startE
26540 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74  q = !pRangeStart
26550 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d   || pRangeStart-
26560 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
26570 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
26580 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
26590 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
265a0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
265b0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
265c0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
265d0 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72  nts = pRangeStar
265e0 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20  t || nEq>0;..   
265f0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64   /* Seek the ind
26600 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  ex cursor to the
26610 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61   start of the ra
26620 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e  nge. */.    nCon
26630 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
26640 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61     if( pRangeSta
26650 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
26660 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
26670 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
26680 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
26690 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
266a0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
266b0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
266c0 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61 72   if( (pRangeStar
266d0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
266e0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
266f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26700 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
26710 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
26720 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
26730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26740 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20 29   if( zStartAff )
26750 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
26760 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
26770 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74  nity(pRight, zSt
26780 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  artAff[nEq])==SQ
26790 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
267a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
267b0 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
267c0 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
267d0 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
267e0 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
267f0 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
26800 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
26810 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
26820 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
26830 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
26840 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
26850 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
26860 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
26870 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
26880 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
26890 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
268a0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
268b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67  inityChange(pRig
268c0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
268d0 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  q]) ){.         
268e0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
268f0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
26900 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
26910 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f     }  .      nCo
26920 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
26930 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
26940 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
26950 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
26960 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
26970 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
26980 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75  else if( isMinQu
26990 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ery ){.      sql
269a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
269b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
269c0 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
269d0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
269e0 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20 3d  .      startEq =
269f0 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f   0;.      start_
26a00 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b  constraints = 1;
26a10 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41  .    }.    codeA
26a20 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
26a30 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
26a40 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72  onstraint, zStar
26a50 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20  tAff);.    op = 
26a60 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f  aStartOp[(start_
26a70 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20  constraints<<2) 
26a80 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b  + (startEq<<1) +
26a90 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65   bRev];.    asse
26aa0 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
26ab0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
26ac0 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20  P_Rewind );.    
26ad0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26ae0 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73  _Last );.    tes
26af0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
26b00 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74  ekGt );.    test
26b10 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
26b20 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  kGe );.    testc
26b30 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
26b40 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Le );.    testca
26b50 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
26b60 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
26b70 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
26b80 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
26b90 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
26ba0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20  nConstraint);.. 
26bb0 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
26bc0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
26bd0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
26be0 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
26bf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67   the.    ** rang
26c00 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  e (if any)..    
26c10 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
26c20 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
26c30 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20  ( pRangeEnd ){. 
26c40 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
26c50 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70  t = pRangeEnd->p
26c60 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
26c70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26c80 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
26c90 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  e, regBase+nEq, 
26ca0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
26cb0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
26cc0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
26cd0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66  e+nEq);.      if
26ce0 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  ( (pRangeEnd->wt
26cf0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
26d00 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
26d10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26d20 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
26d30 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
26d40 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
26d50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26d60 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20  zEndAff ){.     
26d70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
26d80 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
26d90 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45  ight, zEndAff[nE
26da0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
26db0 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
26dc0 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
26dd0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
26de0 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
26df0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
26e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
26e10 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
26e20 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
26e30 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
26e40 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
26e50 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
26e60 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
26e70 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
26e80 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
26e90 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
26ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26eb0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
26ec0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
26ed0 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66  (pRight, zEndAff
26ee0 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
26ef0 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d      zEndAff[nEq]
26f00 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
26f10 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
26f20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f      }  .      co
26f30 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
26f40 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
26f50 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29   nEq+1, zEndAff)
26f60 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
26f70 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73  int++;.      tes
26f80 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
26f90 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
26fa0 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
26fb0 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
26fc0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
26fd0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
26fe0 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66  se->db, zStartAf
26ff0 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
27000 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
27010 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20  , zEndAff);..   
27020 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
27030 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
27040 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
27050 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
27060 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  ddr(v);..    /* 
27070 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64  Check if the ind
27080 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  ex cursor is pas
27090 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
270a0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f   range. */.    o
270b0 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e  p = aEndOp[(pRan
270c0 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20  geEnd || nEq) * 
270d0 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20  (1 + bRev)];.   
270e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
270f0 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65  P_Noop );.    te
27100 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
27110 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  dxGE );.    test
27120 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
27130 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  LT );.    if( op
27140 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
27150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27160 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
27170 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
27180 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
27190 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  raint);.      sq
271a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
271b0 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76  5(v, endEq!=bRev
271c0 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   ?1:0);.    }.. 
271d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
271e0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
271f0 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b  nstraints, check
27200 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a   that the value.
27210 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
27220 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
27230 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
27240 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
27250 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20  NULL..    ** If 
27260 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74  it is, jump to t
27270 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
27280 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  n of the loop.. 
27290 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73     */.    r1 = s
272a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
272b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65  (pParse);.    te
272c0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
272d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
272e0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
272f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
27300 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27310 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
27320 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66  _LIMIT );.    if
27330 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
27340 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
27350 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
27360 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20  _TOP_LIMIT))!=0 
27370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27380 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
27390 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
273a0 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20  , nEq, r1);.    
273b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
273c0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
273d0 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b  , r1, addrCont);
273e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
273f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27400 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20  (pParse, r1);.. 
27410 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
27420 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
27430 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
27440 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
27450 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
27460 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  ;.    disableTer
27470 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
27480 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f  End);.    if( !o
27490 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
274a0 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
274b0 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
274c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
274d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
274e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
274f0 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
27500 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65  IdxCur, iRowidRe
27510 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
27520 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
27530 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
27540 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
27550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp2(v, OP_Seek
27570 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
27580 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64  g);  /* Deferred
27590 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a   seek */.    }..
275a0 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
275b0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
275c0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
275d0 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c  the loop. Disabl
275e0 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20  e .    ** WHERE 
275f0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
27600 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
27610 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
27620 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  can..    */.    
27630 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
27640 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
27650 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20  _UNIQUE ){.     
27660 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
27670 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
27680 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
27690 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
276a0 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
276b0 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
276c0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
276d0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
276e0 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
276f0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
27700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
27710 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
27720 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
27730 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27740 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20  MULTI_OR ){.    
27750 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20  /* Case 4:  Two 
27760 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
27770 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73  ly indexed terms
27780 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
27790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
277a0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
277b0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
277c0 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29  ABLE t1(a,b,c,d)
277d0 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
277e0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
277f0 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (a);.    **   CR
27800 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e  EATE INDEX i2 ON
27810 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(b);.    **  
27820 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33   CREATE INDEX i3
27830 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a   ON t1(c);.    *
27840 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
27850 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
27860 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20  E a=5 OR b=7 OR 
27870 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a  (c=11 AND d=13).
27880 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
27890 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68   the example, th
278a0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e  ere are three in
278b0 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
278c0 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20  ected by OR..   
278d0 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74   ** The top of t
278e0 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69  he loop looks li
278f0 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
27900 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
27910 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20  Null       1    
27920 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65              # Ze
27930 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e  ro the rowset in
27940 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20   reg 1.    **.  
27950 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65    ** Then, for e
27960 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ach indexed term
27970 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e  , the following.
27980 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
27990 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54  o.    ** RowSetT
279a0 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61  est are such tha
279b0 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  t the rowid of t
279c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
279d0 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a  s inserted.    *
279e0 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65  * into the RowSe
279f0 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  t. If it is alre
27a00 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e  ady present, con
27a10 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20  trol skips the. 
27a20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f     ** Gosub opco
27a30 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72  de and jumps str
27a40 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64  aight to the cod
27a50 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57  e generated by W
27a60 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a  hereEnd()..    *
27a70 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
27a80 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27a90 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a  n(<term>).    **
27aa0 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74            RowSet
27ab0 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Test            
27ac0 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72        # Insert r
27ad0 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74  owid into rowset
27ae0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
27af0 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a   Gosub      2 A.
27b00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
27b10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
27b20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
27b30 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76  llowing the abov
27b40 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69  e, code to termi
27b50 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c  nate the loop. L
27b60 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67  abel A, the targ
27b70 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  et.    ** of the
27b80 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75   Gosub above, ju
27b90 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72  mps to the instr
27ba0 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74  uction right aft
27bb0 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20  er the Goto..   
27bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27bd0 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
27c00 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
27c10 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20  *          Goto 
27c20 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20        B         
27c30 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f         # The loo
27c40 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20  p is finished.. 
27c50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27c60 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79     A: <loop body
27c70 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
27c80 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c    # Return data,
27c90 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a   whatever..    *
27ca0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
27cb0 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20    Return     2  
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
27cd0 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  Jump back to the
27ce0 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20   Gosub.    **.  
27cf0 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61    **       B: <a
27d00 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20  fter the loop>. 
27d10 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
27d20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
27d30 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
27d40 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
27d50 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
27d60 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
27d70 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
27d80 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
27d90 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
27da0 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
27db0 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
27dc0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
27dd0 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
27de0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
27df0 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
27e00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
27e10 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
27e40 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
27e50 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
27e60 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
27e90 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
27ea0 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
27eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
27ec0 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
27ed0 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
27ee0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
27ef0 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
27f20 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
27f30 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73  */.    int untes
27f40 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20  tedTerms = 0;   
27f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d            /* Som
27f60 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70  e terms not comp
27f70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f  letely tested */
27f80 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
27f90 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65  .    pTerm = pLe
27fa0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72  vel->plan.u.pTer
27fb0 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
27fc0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
27fd0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
27fe0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29  perator==WO_OR )
27ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
28000 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
28010 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20  TERM_ORINFO)!=0 
28020 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26  );.    pOrWc = &
28030 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
28040 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c  ->wc;.    pLevel
28050 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
28060 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
28070 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
28080 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
28090 65 77 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f  ew SrcList ni pO
280a0 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
280b0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
280c0 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
280d0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
280e0 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
280f0 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
28100 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
28110 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
28120 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
28130 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
28140 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
28150 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28160 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
28170 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
28180 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
28190 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
281a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
281b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
281c0 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
281d0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
281e0 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
281f0 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
28200 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
28210 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
28220 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
28230 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
28240 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
28250 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
28260 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  AllocRaw(pParse-
28270 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
282a0 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
282b0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
282c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
282d0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
282e0 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
282f0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
28300 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79   (i16)(nNotReady
28310 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
28320 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
28330 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
28340 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
28350 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
28360 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
28370 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
28380 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
28390 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
283a0 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
283b0 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
283c0 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
283d0 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
283e0 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
283f0 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
28400 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
28410 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
28420 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
28430 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
28440 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
28450 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
28460 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
28470 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
28480 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
28490 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
284a0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
284b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
284c0 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
284d0 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
284e0 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
284f0 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
28500 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
28510 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
28520 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
28530 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
28540 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
28550 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
28560 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
28570 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
28580 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
28590 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
285a0 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
285b0 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
285c0 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
285d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
285e0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
285f0 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
28600 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
28610 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
28620 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
28630 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
28640 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
28650 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
28660 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
28670 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
28680 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
28690 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
286a0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
286b0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
286c0 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
286d0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
286e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
286f0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
28700 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
28710 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
28720 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28730 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
28740 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
28750 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
28760 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28770 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
28780 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
28790 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
287a0 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
287b0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
287c0 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
287d0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
287e0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
287f0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
28800 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70   || pOrTerm->eOp
28810 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
28820 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
28830 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
28840 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
28850 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
28860 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
28870 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
28880 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
28890 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
288a0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
288b0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
288c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
288d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
288e0 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ab, pOrTerm->pEx
288f0 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28910 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45    WHERE_OMIT_OPE
28920 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43  N | WHERE_OMIT_C
28930 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
28950 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
28960 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   | WHERE_ONETABL
28970 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20  E_ONLY);.       
28980 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29   if( pSubWInfo )
28990 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  {.          expl
289a0 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
289b0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
289c0 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57  , pOrTab, &pSubW
289d0 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76  Info->a[0], iLev
289e0 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  el, pLevel->iFro
289f0 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20 20 29  m, 0.          )
28a00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28a10 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
28a20 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f  ERE_DUPLICATES_O
28a30 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  K)==0 ){.       
28a40 20 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20       int iSet = 
28a50 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65  ((ii==pOrWc->nTe
28a60 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20  rm-1)?-1:ii);.  
28a70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
28a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d  .            r =
28a90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28aa0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
28ab0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  , pTabItem->pTab
28ac0 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20  , -1, iCur, .   
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b        regRowid);
28b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
28b20 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
28b30 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20  st, regRowset,. 
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
28b70 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20  ntAddr(v)+2, r, 
28b80 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
28b90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
28ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28bb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
28bc0 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
28bd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
28be0 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e   The pSubWInfo->
28bf0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c  untestedTerms fl
28c00 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ag means that th
28c10 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20  is OR term.     
28c20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65       ** containe
28c30 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e  d one or more AN
28c40 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f  D term from a no
28c50 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54  tReady table.  T
28c60 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
28c70 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e  terms from the n
28c80 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f  otReady table co
28c90 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65  uld not be teste
28ca0 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20  d and will.     
28cb0 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
28cc0 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e  be tested later.
28cd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
28ce0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
28cf0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
28d00 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54  erms ) untestedT
28d10 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20  erms = 1;..     
28d20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
28d30 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
28d40 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
28d50 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
28d60 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
28d70 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
28d80 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
28d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28da0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
28db0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
28dc0 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
28dd0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
28de0 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
28df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28e00 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
28e10 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
28e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
28e30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
28e40 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
28e50 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
28e60 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
28e70 61 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e  ackFree(pParse->
28e80 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
28e90 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
28ea0 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
28eb0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
28ec0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
28ed0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28ee0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
28ef0 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
28f00 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73  ase 5:  There is
28f10 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
28f20 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
28f30 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
28f40 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
28f50 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
28f60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
28f70 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
28f80 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
28f90 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
28fa0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
28fb0 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
28fc0 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
28fd0 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
28fe0 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
28ff0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
29000 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
29010 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
29020 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
29030 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
29040 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
29050 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
29060 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
29070 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20  , aStart[bRev], 
29080 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a  iCur, addrBrk);.
29090 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
290a0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
290b0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
290c0 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79  ;.  }.  notReady
290d0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
290e0 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
290f0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20  );..  /* Insert 
29100 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65  code to test eve
29110 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ry subexpression
29120 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d   that can be com
29130 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d  pletely.  ** com
29140 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
29150 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
29160 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
29170 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
29180 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33  OF: R-49525-5093
29190 35 20 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e  5 Terms that can
291a0 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69 65 64  not be satisfied
291b0 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68   through.  ** th
291c0 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
291d0 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68   become tests th
291e0 61 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  at are evaluated
291f0 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f   against each ro
29200 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65  w of.  ** the re
29210 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62  levant input tab
29220 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
29230 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
29240 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
29250 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
29260 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
29270 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
29280 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
29290 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
292a0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
292b0 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  62 */.    testca
292c0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
292d0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
292e0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
292f0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
29300 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
29310 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
29320 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
29330 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
29340 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
29350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
29360 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
29370 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
29380 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
29390 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
293a0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
293b0 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
293c0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
293d0 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
293e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
293f0 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
29400 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
29410 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
29420 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
29430 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
29440 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
29450 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
29460 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
29470 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29480 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
29490 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
294a0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
294b0 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
294c0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
294d0 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
294e0 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
294f0 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
29500 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
29510 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
29520 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65   that.  ** at le
29530 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
29540 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
29550 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
29560 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a  eft table.  .  *
29570 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
29580 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
29590 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
295a0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
295b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
295c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
295d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
295e0 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 1, pLevel->
295f0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
29600 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
29610 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49  "record LEFT JOI
29620 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71  N hit"));.    sq
29630 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29640 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
29650 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
29660 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e  a, j=0; j<pWC->n
29670 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
29680 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ++){.      testc
29690 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
296a0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
296b0 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  AL );  /* IMP: R
296c0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
296d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
296e0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
296f0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
29700 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
29710 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
29720 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
29730 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
29740 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
29750 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
29760 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
29770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
29780 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
29790 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63  rms );.        c
297a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
297b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
297c0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
297d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
297e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
297f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
29800 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
29810 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
29820 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
29830 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
29840 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
29850 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
29860 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
29870 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72  seReg);..  retur
29880 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  n notReady;.}..#
29890 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
298a0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
298b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
298c0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
298d0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
298e0 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
298f0 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
29900 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
29910 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
29920 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
29930 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
29940 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
29950 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
29960 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
29970 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
29980 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
29990 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
299a0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
299b0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
299c0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
299d0 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
299e0 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
299f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29a00 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
29a10 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
29a20 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
29a30 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
29a40 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
29a50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
29a60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
29a70 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
29a80 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
29a90 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
29aa0 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f  f( ALWAYS(pWInfo
29ab0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
29ac0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29ad0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
29ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
29af0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
29b00 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
29b10 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
29b20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
29b30 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65  .        /* asse
29b40 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  rt( pInfo->needT
29b50 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c  oFreeIdxStr==0 |
29b60 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29b70 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  ed ); */.       
29b80 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64   if( pInfo->need
29b90 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
29ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29bb0 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64  3_free(pInfo->id
29bc0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  xStr);.        }
29bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29be0 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f  DbFree(db, pInfo
29bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29c00 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69   if( pWInfo->a[i
29c10 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ].plan.wsFlags &
29c20 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
29c30 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  X ){.        Ind
29c40 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49 6e 66  ex *pIdx = pWInf
29c50 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70  o->a[i].plan.u.p
29c60 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Idx;.        if(
29c70 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   pIdx ){.       
29c80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
29c90 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  (db, pIdx->zColA
29ca0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ff);.          s
29cb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
29cc0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
29cd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29ce0 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
29cf0 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43  lear(pWInfo->pWC
29d00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
29d10 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
29d20 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
29d30 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
29d40 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
29d50 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
29d60 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
29d70 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
29d80 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
29d90 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
29da0 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
29db0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
29dc0 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
29dd0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
29de0 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
29df0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
29e00 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
29e10 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
29e20 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
29e30 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
29e40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
29e50 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
29e60 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
29e70 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
29e80 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
29e90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
29ea0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29eb0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
29ec0 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
29ed0 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
29ee0 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
29ef0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
29f00 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
29f10 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
29f20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
29f30 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
29f40 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
29f50 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
29f60 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
29f70 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
29f80 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
29f90 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
29fa0 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
29fb0 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
29fc0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
29fd0 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
29fe0 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
29ff0 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
2a000 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
2a010 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2a020 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
2a030 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
2a040 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2a050 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2a060 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2a070 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
2a080 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2a090 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
2a0a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
2a0b0 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
2a0c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
2a0d0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
2a0e0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2a0f0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
2a100 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
2a110 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
2a140 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
2a150 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
2a170 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2a180 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
2a190 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
2a1a0 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
2a1b0 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
2a1c0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
2a1d0 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
2a1e0 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
2a1f0 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
2a200 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
2a210 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
2a220 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
2a230 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
2a240 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
2a250 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
2a260 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
2a270 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
2a280 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
2a290 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
2a2a0 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
2a2b0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
2a2c0 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
2a2d0 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
2a2e0 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
2a2f0 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
2a300 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
2a310 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
2a320 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
2a330 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
2a340 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
2a350 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
2a360 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
2a370 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2a380 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2a390 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
2a3a0 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
2a3b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2a3c0 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
2a3d0 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
2a3e0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
2a3f0 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
2a400 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
2a410 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
2a420 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
2a430 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
2a440 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
2a450 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
2a460 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
2a470 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
2a480 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
2a490 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
2a4a0 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
2a4b0 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
2a4c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
2a4d0 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
2a4e0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
2a4f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a500 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
2a510 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
2a520 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
2a530 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
2a540 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
2a550 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
2a560 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
2a570 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
2a580 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
2a590 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
2a5a0 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
2a5b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2a5c0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
2a5d0 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
2a5e0 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
2a5f0 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
2a600 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
2a610 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
2a620 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
2a630 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
2a640 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2a650 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
2a660 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
2a670 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
2a680 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
2a690 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
2a6a0 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
2a6b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
2a6c0 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
2a6d0 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
2a6e0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
2a6f0 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
2a700 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
2a710 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
2a720 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
2a730 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
2a740 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a750 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
2a760 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
2a770 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
2a780 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
2a790 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
2a7a0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
2a7b0 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
2a7c0 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
2a7d0 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
2a7e0 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
2a7f0 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
2a800 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
2a810 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
2a820 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
2a830 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
2a840 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
2a850 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
2a860 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
2a870 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2a880 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
2a890 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
2a8a0 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
2a8b0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
2a8c0 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
2a8d0 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
2a8e0 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
2a8f0 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
2a900 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
2a910 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
2a920 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
2a930 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
2a940 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
2a950 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
2a960 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
2a970 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
2a980 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
2a990 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70  ESSING.**.** *pp
2a9a0 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
2a9b0 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
2a9c0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61  R BY clause of a
2a9d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2a9e0 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  t,.** if there i
2a9f0 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
2aa00 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
2aa10 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
2aa20 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
2aa30 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
2aa40 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2aa50 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
2aa60 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c  ppOrderBy is NUL
2aa70 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  L..**.** If an i
2aa80 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
2aa90 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74   so that the nat
2aaa0 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65  ural output orde
2aab0 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  r of the table.*
2aac0 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63  * scan is correc
2aad0 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  t for the ORDER 
2aae0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2aaf0 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73  that index is us
2ab00 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64  ed and.** *ppOrd
2ab10 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e  erBy is set to N
2ab20 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e  ULL.  This is an
2ab30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68   optimization th
2ab40 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a  at prevents an.*
2ab50 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  * unnecessary so
2ab60 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
2ab70 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78   set if an index
2ab80 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
2ab90 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
2aba0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
2abb0 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
2abc0 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
2abd0 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
2abe0 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
2abf0 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
2ac00 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
2ac10 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f  r, then the *ppO
2ac20 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e  rderBy is unchan
2ac30 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ged..*/.WhereInf
2ac40 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
2ac50 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
2ac60 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
2ac70 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2ac80 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
2ac90 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
2aca0 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2acb0 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
2acc0 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
2acd0 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
2ace0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
2acf0 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
2ad00 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f  t **ppOrderBy, /
2ad10 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
2ad20 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
2ad30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
2ad40 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20  stinct,  /* The 
2ad50 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20  select-list for 
2ad60 44 49 53 54 49 4e 43 54 20 71 75 65 72 69 65 73  DISTINCT queries
2ad70 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20   - or NULL */.  
2ad80 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
2ad90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2ada0 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
2adb0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
2adc0 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20  iteInt.h */.){. 
2add0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2adf0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2ae00 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ae20 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
2ae30 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
2ae40 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
2ae50 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
2ae60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ae70 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2ae80 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
2ae90 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2aea0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
2aeb0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
2aec0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
2aed0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2aee0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2aef0 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
2af00 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
2af10 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
2af20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
2af30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
2af40 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
2af50 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
2af60 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
2af70 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
2af80 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2af90 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
2afa0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
2afb0 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  WC;             
2afc0 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
2afd0 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
2afe0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2aff0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b000 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41  *pTabItem;  /* A
2b010 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72   single entry fr
2b020 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  om pTabList */. 
2b030 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
2b040 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
2b050 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
2b060 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f  el in the pWInfo
2b070 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
2b080 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
2b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2b0a0 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
2b0b0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
2b0c0 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
2b0d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b0e0 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
2b0f0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d  tion of all pWC-
2b100 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a  >a[].wtFlags */.
2b110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b130 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
2b140 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ion */..  /* The
2b150 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
2b160 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2b170 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
2b180 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2b190 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
2b1a0 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
2b1b0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
2b1c0 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
2b1d0 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
2b1e0 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
2b1f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2b200 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
2b210 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
2b220 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
2b230 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2b240 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2b250 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
2b260 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
2b270 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
2b280 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
2b290 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
2b2a0 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  he WHERE_ONETABL
2b2b0 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
2b2c0 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
2b2d0 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
2b2e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
2b2f0 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
2b300 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
2b310 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
2b320 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
2b330 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
2b340 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
2b350 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
2b360 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
2b370 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
2b380 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2b390 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62  ONLY) ? 1 : pTab
2b3a0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
2b3b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b3c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
2b3d0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
2b3e0 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
2b3f0 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
2b400 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
2b410 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
2b420 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2b430 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
2b440 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
2b450 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
2b460 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
2b470 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2b480 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
2b490 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
2b4a0 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
2b4b0 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
2b4c0 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
2b4d0 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
2b4e0 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
2b4f0 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
2b500 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
2b510 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
2b520 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
2b530 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
2b540 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  elow..  */.  db 
2b550 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2b560 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
2b570 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
2b580 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
2b590 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
2b5a0 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
2b5b0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2b5c0 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
2b5d0 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a    nByteWInfo + .
2b5e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
2b5f0 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20  reClause) +.    
2b600 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61    sizeof(WhereMa
2b610 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66  skSet).  );.  if
2b620 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b630 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
2b640 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
2b650 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
2b660 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
2b670 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2b680 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
2b690 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
2b6a0 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
2b6b0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
2b6c0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
2b6d0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
2b6e0 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
2b6f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b700 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
2b710 70 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65  pWC = pWC = (Whe
2b720 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38  reClause *)&((u8
2b730 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65   *)pWInfo)[nByte
2b740 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f  WInfo];.  pWInfo
2b750 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
2b760 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
2b770 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2b780 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
2b790 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
2b7a0 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61  skSet = (WhereMa
2b7b0 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a  skSet*)&pWC[1];.
2b7c0 0a 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68  .  /* Disable th
2b7d0 65 20 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d  e DISTINCT optim
2b7e0 69 7a 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  ization if SQLIT
2b7f0 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73  E_DistinctOpt is
2b800 20 73 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71   set via.  ** sq
2b810 6c 69 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28  lite3_test_ctrl(
2b820 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2b830 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e  OPTIMIZATIONS,..
2b840 2e 29 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .) */.  if( db->
2b850 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  flags & SQLITE_D
2b860 69 73 74 69 6e 63 74 4f 70 74 20 29 20 70 44 69  istinctOpt ) pDi
2b870 73 74 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  stinct = 0;..  /
2b880 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
2b890 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
2b8a0 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
2b8b0 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
2b8c0 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
2b8d0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2b8e0 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
2b8f0 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
2b900 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
2b910 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
2b920 49 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73 65  Init(pWC, pParse
2b930 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  , pMaskSet);.  s
2b940 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
2b950 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
2b960 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
2b970 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72  Split(pWC, pWher
2b980 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a  e, TK_AND);   /*
2b990 20 49 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33   IMP: R-15842-53
2b9a0 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a  296 */.    .  /*
2b9b0 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
2b9c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2b9d0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
2b9e0 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
2b9f0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
2ba00 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
2ba10 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
2ba20 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
2ba30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
2ba40 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d  re && (nTabList=
2ba50 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
2ba60 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
2ba70 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
2ba80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2ba90 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
2baa0 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
2bab0 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
2bac0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
2bad0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
2bae0 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
2baf0 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
2bb00 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
2bb10 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2bb20 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
2bb30 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
2bb40 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
2bb50 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
2bb60 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
2bb70 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
2bb80 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
2bb90 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
2bba0 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
2bbb0 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
2bbc0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
2bbd0 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
2bbe0 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
2bbf0 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
2bc00 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
2bc10 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
2bc20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
2bc30 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
2bc40 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
2bc50 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
2bc60 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
2bc70 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
2bc80 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
2bc90 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
2bca0 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
2bcb0 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
2bcc0 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
2bcd0 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
2bce0 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
2bcf0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2bd00 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
2bd10 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
2bd20 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
2bd30 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
2bd40 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
2bd50 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
2bd60 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
2bd70 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  5..  **.  ** Con
2bd80 66 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65  figure the Where
2bd90 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72  Clause.vmask var
2bda0 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69  iable so that bi
2bdb0 74 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ts that correspo
2bdc0 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75  nd.  ** to virtu
2bdd0 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
2bde0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69   are set. This i
2bdf0 73 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74  s used to select
2be00 69 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20  ively disable . 
2be10 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e   ** the OR-to-IN
2be20 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2be30 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  in exprAnalyzeOr
2be40 54 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f  Term(). It is no
2be50 74 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20  t helpful .  ** 
2be60 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
2be70 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  les..  **.  ** N
2be80 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
2be90 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2bea0 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
2beb0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
2bec0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
2bed0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
2bee0 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
2bef0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
2bf00 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
2bf10 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
2bf20 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
2bf30 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
2bf40 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
2bf50 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2bf60 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
2bf70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43  */.  assert( pWC
2bf80 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d  ->vmask==0 && pM
2bf90 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a  askSet->n==0 );.
2bfa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2bfb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2bfc0 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
2bfd0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2bfe0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
2bff0 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  or);.#ifndef SQL
2c000 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c010 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c  TABLE.    if( AL
2c020 57 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61  WAYS(pTabList->a
2c030 5b 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56  [i].pTab) && IsV
2c040 69 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d  irtual(pTabList-
2c050 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[i].pTab) ){. 
2c060 20 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20       pWC->vmask 
2c070 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c  |= ((Bitmask)1 <
2c080 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  < i);.    }.#end
2c090 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  if.  }.#ifndef N
2c0a0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69  DEBUG.  {.    Bi
2c0b0 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20  tmask toTheLeft 
2c0c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
2c0d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2c0e0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2c0f0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d  Bitmask m = getM
2c100 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2c110 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2c120 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rsor);.      ass
2c130 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68  ert( (m-1)==toTh
2c140 65 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74  eLeft );.      t
2c150 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20  oTheLeft |= m;. 
2c160 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2c170 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
2c180 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
2c190 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
2c1a0 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
2c1b0 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
2c1c0 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
2c1d0 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
2c1e0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2c1f0 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
2c200 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
2c210 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
2c220 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
2c230 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
2c240 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
2c250 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
2c260 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
2c270 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
2c280 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
2c290 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e  d..  */.  exprAn
2c2a0 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73  alyzeAll(pTabLis
2c2b0 74 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64  t, pWC);.  if( d
2c2c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c2d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
2c2e0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2c2f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
2c300 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
2c310 6c 69 66 69 65 72 2c 20 69 66 20 74 68 65 72 65  lifier, if there
2c320 20 69 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75   is one, is redu
2c330 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20  ndant. .  ** If 
2c340 69 74 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20  it is, then set 
2c350 70 44 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c  pDistinct to NUL
2c360 4c 20 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e  L and WhereInfo.
2c370 65 44 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a  eDistinct to.  *
2c380 2a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  * WHERE_DISTINCT
2c390 5f 55 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20  _UNIQUE to tell 
2c3a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67  the caller to ig
2c3b0 6e 6f 72 65 20 74 68 65 20 44 49 53 54 49 4e 43  nore the DISTINC
2c3c0 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  T..  */.  if( pD
2c3d0 69 73 74 69 6e 63 74 20 26 26 20 69 73 44 69 73  istinct && isDis
2c3e0 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70  tinctRedundant(p
2c3f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2c400 20 70 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29   pWC, pDistinct)
2c410 20 29 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63   ){.    pDistinc
2c420 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66  t = 0;.    pWInf
2c430 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
2c440 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2c450 49 51 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  IQUE;.  }..  /* 
2c460 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
2c470 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
2c480 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
2c490 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
2c4a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
2c4b0 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
2c4c0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
2c4d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
2c4e0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
2c4f0 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
2c500 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
2c510 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
2c520 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2c530 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48  a[].wsFlags   WH
2c540 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
2c550 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
2c560 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
2c570 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
2c580 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
2c590 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
2c5a0 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
2c5b0 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
2c5c0 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74   Which term of t
2c5d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
2c5e0 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
2c5f0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2c600 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
2c610 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
2c620 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
2c630 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
2c640 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
2c650 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2c660 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
2c670 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2c680 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77  pTerm     When w
2c690 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74  sFlags==WO_OR, t
2c6a0 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72  he OR-clause ter
2c6b0 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  m.  **.  ** This
2c6c0 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72   loop also figur
2c6d0 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69  es out the nesti
2c6e0 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  ng order of tabl
2c6f0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
2c700 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
2c710 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2c720 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64  Bitmask)0;.  and
2c730 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48  Flags = ~0;.  WH
2c740 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2c750 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
2c760 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69  **\n"));.  for(i
2c770 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c  =iFrom=0, pLevel
2c780 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
2c790 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
2c7a0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
2c7b0 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
2c7c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
2c7d0 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
2c7e0 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
2c7f0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c810 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
2c820 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
2c830 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c850 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2c860 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
2c870 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
2c880 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20  bestJ = -1;     
2c890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
2c8a0 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
2c8b0 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8d0 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
2c8e0 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
2c8f0 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61      int isOptima
2c900 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2c910 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
2c920 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69  optimal/non-opti
2c930 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  mal search */.  
2c940 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61    int nUnconstra
2c950 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ined;         /*
2c960 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77   Number tables w
2c970 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42  ithout INDEXED B
2c980 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  Y */.    Bitmask
2c990 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20   notIndexed;    
2c9a0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2c9b0 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e  tables that cann
2c9c0 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
2c9d0 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 42  */.    double rB
2c9e0 65 73 74 4f 70 74 69 6d 61 6c 49 64 78 3b 20 20  estOptimalIdx;  
2c9f0 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 62 65     /* Cost of be
2ca00 73 74 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78  st optimal index
2ca10 20 70 6c 61 6e 20 2a 2f 0a 0a 20 20 20 20 6d 65   plan */..    me
2ca20 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
2ca30 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
2ca40 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
2ca50 61 6e 2e 72 43 6f 73 74 20 3d 20 72 42 65 73 74  an.rCost = rBest
2ca60 4f 70 74 69 6d 61 6c 49 64 78 20 3d 20 53 51 4c  OptimalIdx = SQL
2ca70 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
2ca80 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2ca90 2a 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66  * Begin search f
2caa0 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e  or loop %d ***\n
2cab0 22 2c 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ", i));..    /* 
2cac0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2cad0 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69   remaining entri
2cae0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2caf0 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68  lause to find th
2cb00 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65  e.    ** next ne
2cb10 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c  sted loop. The l
2cb20 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52  oop tests all FR
2cb30 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65  OM clause entrie
2cb40 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20  s.    ** either 
2cb50 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a  once or twice. .
2cb60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2cb70 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73 20  e first test is 
2cb80 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64  always performed
2cb90 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77   if there are tw
2cba0 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65  o or more entrie
2cbb0 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69  s.    ** remaini
2cbc0 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72  ng and never per
2cbd0 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20  formed if there 
2cbe0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d  is only one FROM
2cbf0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20   clause entry.  
2cc00 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66    ** to choose f
2cc10 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20  rom.  The first 
2cc20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61  test looks for a
2cc30 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e  n "optimal" scan
2cc40 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69  .  In.    ** thi
2cc50 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74  s context an opt
2cc60 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65  imal scan is one
2cc70 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
2cc80 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20  ame strategy.   
2cc90 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65   ** for the give
2cca0 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  n FROM clause en
2ccb0 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20  try as would be 
2ccc0 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20  selected if the 
2ccd0 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72  entry.    ** wer
2cce0 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e  e used as the in
2ccf0 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c  nermost nested l
2cd00 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  oop.  In other w
2cd10 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20  ords, a table.  
2cd20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73    ** is chosen s
2cd30 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73  uch that the cos
2cd40 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61  t of running tha
2cd50 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  t table cannot b
2cd60 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a  e reduced.    **
2cd70 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20   by waiting for 
2cd80 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
2cd90 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73  run first.  This
2cda0 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20   "optimal" test 
2cdb0 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20  works.    ** by 
2cdc0 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74  first assuming t
2cdd0 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  hat the FROM cla
2cde0 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e  use is on the in
2cdf0 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e  ner loop and fin
2ce00 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20  ding.    ** its 
2ce10 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e  query plan, then
2ce20 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
2ce30 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20 70   if that query p
2ce40 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20  lan uses any.   
2ce50 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   ** other FROM c
2ce60 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
2ce70 20 61 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20   are notReady.  
2ce80 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74  If no notReady t
2ce90 65 72 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  erms are.    ** 
2cea0 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f  used then the "o
2ceb0 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c  ptimal" query pl
2cec0 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a  an works..    **
2ced0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2cee0 74 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e  t the WhereCost.
2cef0 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66  nRow parameter f
2cf00 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  or an optimal sc
2cf10 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  an might.    ** 
2cf20 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20  not be as small 
2cf30 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
2cf40 66 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c  f the table real
2cf50 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65  ly were the inne
2cf60 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69  rmost.    ** joi
2cf70 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  n.  The nRow val
2cf80 75 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ue can be reduce
2cf90 64 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73  d by WHERE claus
2cfa0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
2cfb0 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
2cfc0 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42   use indices.  B
2cfd0 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64  ut this nRow red
2cfe0 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70  uction only happ
2cff0 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ens if the.    *
2d000 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69  * table really i
2d010 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
2d020 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  join.  .    **. 
2d030 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
2d040 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
2d050 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65  is only performe
2d060 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20  d if no optimal 
2d070 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61  scan.    ** stra
2d080 74 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e  tegies were foun
2d090 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69  d by the first i
2d0a0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73  teration. This s
2d0b0 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a  econd iteration.
2d0c0 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74      ** is used t
2d0d0 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
2d0e0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61   lowest cost sca
2d0f0 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a  n overall..    *
2d100 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75  *.    ** Previou
2d110 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
2d120 4c 69 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  Lite performed o
2d130 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69  nly the second i
2d140 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a  teration -.    *
2d150 2a 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72  * the next outer
2d160 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c  most loop was al
2d170 77 61 79 73 20 74 68 61 74 20 77 69 74 68 20 74  ways that with t
2d180 68 65 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c  he lowest overal
2d190 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48  l.    ** cost. H
2d1a0 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61  owever, this mea
2d1b0 6e 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  nt that SQLite c
2d1c0 6f 75 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20  ould select the 
2d1d0 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a  wrong plan.    *
2d1e0 2a 20 66 6f 72 20 73 63 72 69 70 74 73 20 73 75  * for scripts su
2d1f0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
2d200 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20  ing:.    **   . 
2d210 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
2d220 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a  ABLE t1(a, b); .
2d230 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
2d240 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a  TABLE t2(c, d);.
2d250 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2d260 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48  * FROM t2, t1 WH
2d270 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74  ERE t2.rowid = t
2d280 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1.a;.    **.    
2d290 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74 72 61  ** The best stra
2d2a0 74 65 67 79 20 69 73 20 74 6f 20 69 74 65 72 61  tegy is to itera
2d2b0 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
2d2c0 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76   t1 first. Howev
2d2d0 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  er it.    ** is 
2d2e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2d2f0 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77  determine this w
2d300 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65  ith a simple gre
2d310 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  edy algorithm.. 
2d320 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20     ** Since the 
2d330 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
2d340 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
2d350 62 6c 65 20 74 32 20 69 73 20 74 68 65 20 73 61  ble t2 is the sa
2d360 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  me .    ** as th
2d370 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
2d380 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
2d390 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70  table t1, a simp
2d3a0 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a  le greedy .    *
2d3b0 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20  * algorithm may 
2d3c0 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32  choose to use t2
2d3d0 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
2d3e0 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61 20  oop, which is a 
2d3f0 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74  much.    ** cost
2d400 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20  lier approach.. 
2d410 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e     */.    nUncon
2d420 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20  strained = 0;.  
2d430 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30    notIndexed = 0
2d440 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69  ;.    for(isOpti
2d450 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c  mal=(iFrom<nTabL
2d460 69 73 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61  ist-1); isOptima
2d470 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b  l>=0 && bestJ<0;
2d480 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20   isOptimal--){. 
2d490 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
2d4a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2d4b0 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
2d4c0 20 6e 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a   not yet ready *
2d4d0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46  /.      for(j=iF
2d4e0 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
2d4f0 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
2d500 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20  <nTabList; j++, 
2d510 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pTabItem++){.   
2d520 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65       int doNotRe
2d530 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75  order;    /* Tru
2d540 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  e if this table 
2d550 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65  should not be re
2d560 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
2d570 20 20 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f     WhereCost sCo
2d580 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20  st;     /* Cost 
2d590 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2d5a0 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e   best[Virtual]In
2d5b0 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  dex() */.       
2d5c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2d5d0 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42  rBy;  /* ORDER B
2d5e0 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  Y clause for ind
2d5f0 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
2d600 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2d610 73 74 20 2a 70 44 69 73 74 3b 20 20 20 20 20 2f  st *pDist;     /
2d620 2a 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  * DISTINCT claus
2d630 65 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f  e for index to o
2d640 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20  ptimize */.  .  
2d650 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64        doNotReord
2d660 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d  er =  (pTabItem-
2d670 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  >jointype & (JT_
2d680 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2d690 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
2d6a0 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f  j!=iFrom && doNo
2d6b0 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
2d6c0 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65  ;.        m = ge
2d6d0 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2d6e0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2d6f0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2d700 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
2d710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2d720 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
2d730 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  rom++;.         
2d740 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2d750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73     }.        mas
2d760 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f  k = (isOptimal ?
2d770 20 6d 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a   m : notReady);.
2d780 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
2d790 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f   = ((i==0 && ppO
2d7a0 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65  rderBy )?*ppOrde
2d7b0 72 42 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  rBy:0);.        
2d7c0 70 44 69 73 74 20 3d 20 28 69 3d 3d 30 20 3f 20  pDist = (i==0 ? 
2d7d0 70 44 69 73 74 69 6e 63 74 20 3a 20 30 29 3b 0a  pDistinct : 0);.
2d7e0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
2d7f0 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  Item->pIndex==0 
2d800 29 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64  ) nUnconstrained
2d810 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57  ++;.  .        W
2d820 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20  HERETRACE(("=== 
2d830 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20  trying table %d 
2d840 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25  with isOptimal=%
2d850 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20  d ===\n",.      
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2d870 20 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20   isOptimal));.  
2d880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2d890 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
2d8a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d8b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2d8c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2d8d0 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
2d8e0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2d8f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
2d900 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70  x_info **pp = &p
2d910 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78  WInfo->a[j].pIdx
2d920 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2d930 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
2d940 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2d950 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f  abItem, mask, no
2d960 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
2d970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 43               &sC
2d990 6f 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20  ost, pp);.      
2d9a0 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
2d9b0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2d9c0 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
2d9d0 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
2d9e0 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20  pTabItem, mask, 
2d9f0 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72  notReady, pOrder
2da00 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2da10 20 20 70 44 69 73 74 2c 20 26 73 43 6f 73 74 29    pDist, &sCost)
2da20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2da30 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2da40 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e  timal || (sCost.
2da50 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
2da60 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  0 );..        /*
2da70 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
2da80 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  Y clause is pres
2da90 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c  ent, then the pl
2daa0 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74  an must use that
2dab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2dac0 78 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79  x if it uses any
2dad0 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f   index at all */
2dae0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2daf0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2db00 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x==0 .          
2db10 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73          || (sCos
2db20 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2db30 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2db40 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  CAN)==0.        
2db50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f            || sCo
2db60 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  st.plan.u.pIdx==
2db70 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2db80 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
2db90 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73   isOptimal && (s
2dba0 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2dbb0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2dbc0 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
2dbd0 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78          notIndex
2dbe0 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ed |= m;.       
2dbf0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
2dc00 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20  onditions under 
2dc10 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65  which this table
2dc20 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73   becomes the bes
2dc30 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20  t so far:.      
2dc40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2dc50 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20    (1) The table 
2dc60 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20  must not depend 
2dc70 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  on other tables 
2dc80 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20  that have not.  
2dc90 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79        **       y
2dca0 65 74 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20  et run..        
2dcb0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2dcc0 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65  (2) A full-table
2dcd0 2d 73 63 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70  -scan cannot sup
2dce0 65 72 63 65 64 65 20 61 6e 20 69 6e 64 65 78 65  ercede an indexe
2dcf0 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20  d plan unless.  
2dd00 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 28        **       (
2dd10 61 29 20 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c  a) the full-tabl
2dd20 65 2d 73 63 61 6e 20 69 73 20 61 6e 20 22 6f 70  e-scan is an "op
2dd30 74 69 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64  timal" plan as d
2dd40 65 66 69 6e 65 64 20 61 62 6f 76 65 0a 20 20 20  efined above.   
2dd50 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 72       **       or
2dd60 20 28 62 29 20 74 68 65 20 63 6f 73 74 20 6f 66   (b) the cost of
2dd70 20 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d   the full-table-
2dd80 73 63 61 6e 20 69 73 20 6c 65 73 73 20 74 68 61  scan is less tha
2dd90 6e 20 74 68 65 20 63 6f 73 74 0a 20 20 20 20 20  n the cost.     
2dda0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 66 20 74     **       of t
2ddb0 68 65 20 62 65 73 74 20 6f 70 74 69 6d 61 6c 20  he best optimal 
2ddc0 69 6e 64 65 78 20 70 6c 61 6e 2e 0a 20 20 20 20  index plan..    
2ddd0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2dde0 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c  *   (3) All tabl
2ddf0 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58  es have an INDEX
2de00 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
2de10 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73  this table lacks
2de20 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   an.        **  
2de30 20 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20       INDEXED BY 
2de40 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
2de50 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70  able uses the sp
2de60 65 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a  ecific.        *
2de70 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70  *       index sp
2de80 65 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49  ecified by its I
2de90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2dea0 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73  .  This rule ens
2deb0 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ures.        ** 
2dec0 20 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73        that a bes
2ded0 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61  t-so-far is alwa
2dee0 79 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e  ys selected even
2def0 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c   if an impossibl
2df00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
2df10 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f     combination o
2df20 66 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  f INDEXED BY cla
2df30 75 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20  uses are given. 
2df40 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   The error.     
2df50 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c     **       will
2df60 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
2df70 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f   relayed back to
2df80 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
2df90 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
2dfa0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2dfb0 28 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73  (4) The plan cos
2dfc0 74 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20  t must be lower 
2dfd0 74 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73  than prior plans
2dfe0 20 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20   or else the.   
2dff0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f       **       co
2e000 73 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  st must be the s
2e010 61 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ame and the numb
2e020 65 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20  er of rows must 
2e030 62 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20  be lower..      
2e040 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2e050 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74   (sCost.used&not
2e060 52 65 61 64 79 29 3d 3d 30 20 20 20 20 20 20 20  Ready)==0       
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
2e090 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2e0a0 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f   (bestJ<0 || (no
2e0b0 74 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20  tIndexed&m)!=0  
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2e0e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2e0f0 20 20 7c 7c 20 28 62 65 73 74 50 6c 61 6e 2e 70    || (bestPlan.p
2e100 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e110 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
2e120 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2e130 20 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74    || sCost.rCost
2e140 3c 72 42 65 73 74 4f 70 74 69 6d 61 6c 49 64 78  <rBestOptimalIdx
2e150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
2e160 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46   (sCost.plan.wsF
2e170 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2e180 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20  _FULLSCAN)!=0). 
2e190 20 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63          && (nUnc
2e1a0 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c  onstrained==0 ||
2e1b0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2e1c0 78 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  x==0            
2e1d0 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2e1f0 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61  sCost.plan.wsFla
2e200 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
2e210 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20 20  ULLSCAN)!=0).   
2e220 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c        && (bestJ<
2e230 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74  0 || sCost.rCost
2e240 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20  <bestPlan.rCost 
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
2e270 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
2e280 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50  ost.rCost<=bestP
2e290 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20  lan.rCost .     
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
2e2b0 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 62  Cost.plan.nRow<b
2e2c0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
2e2d0 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  w)).        ){. 
2e2e0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
2e2f0 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65 20  ACE(("=== table 
2e300 25 64 20 69 73 20 62 65 73 74 20 73 6f 20 66 61  %d is best so fa
2e310 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2e320 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2e330 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77  cost=%g and nRow
2e340 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2e360 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43   sCost.rCost, sC
2e370 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b  ost.plan.nRow));
2e380 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50  .          bestP
2e390 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20  lan = sCost;.   
2e3a0 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
2e3b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e3c0 20 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61      if( isOptima
2e3d0 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 73  l.         && (s
2e3e0 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2e3f0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2e400 4c 4c 53 43 41 4e 29 21 3d 30 0a 20 20 20 20 20  LLSCAN)!=0.     
2e410 20 20 20 20 26 26 20 73 43 6f 73 74 2e 72 43 6f      && sCost.rCo
2e420 73 74 3c 72 42 65 73 74 4f 70 74 69 6d 61 6c 49  st<rBestOptimalI
2e430 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
2e440 20 20 20 20 20 20 20 20 72 42 65 73 74 4f 70 74          rBestOpt
2e450 69 6d 61 6c 49 64 78 20 3d 20 62 65 73 74 50 6c  imalIdx = bestPl
2e460 61 6e 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  an.rCost;.      
2e470 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e480 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2e490 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2e4a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e4b0 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
2e4c0 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
2e4d0 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
2e4e0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2e4f0 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2e500 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
2e510 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2e520 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
2e530 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22   %d for loop %d"
2e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e550 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2e560 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57  bestJ, pLevel-pW
2e590 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61  Info->a, bestPla
2e5a0 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61  n.rCost, bestPla
2e5b0 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20  n.plan.nRow));. 
2e5c0 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2e5d0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e5e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d  WHERE_ORDERBY)!=
2e5f0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72  0 ){.      *ppOr
2e600 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
2e610 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c  .    if( (bestPl
2e620 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2e630 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2e640 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
2e650 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44  sert( pWInfo->eD
2e660 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
2e670 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2e680 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2e690 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2e6a0 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
2e6b0 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
2e6c0 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
2e6d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
2e6e0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
2e6f0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
2e700 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2e710 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2e720 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ED );.    testca
2e730 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  se( bestPlan.pla
2e740 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e750 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a  E_TEMP_INDEX );.
2e760 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2e770 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e780 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2e790 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2e7a0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
2e7b0 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
2e7c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
2e7e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
2e7f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
2e800 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
2e810 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2e820 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
2e830 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
2e840 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
2e850 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20  )bestJ;.    if( 
2e860 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2e870 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  ow>=(double)1 ){
2e880 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2e890 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73  QueryLoop *= bes
2e8a0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  tPlan.plan.nRow;
2e8b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e8c0 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
2e8d0 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62   table scanned b
2e8e0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  y this loop iter
2e8f0 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20  ation had an.   
2e900 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63   ** INDEXED BY c
2e910 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
2e920 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e  o it, that the n
2e930 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65  amed index is be
2e940 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  ing.    ** used 
2e950 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66  for the scan. If
2e960 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79   not, then query
2e970 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73   compilation has
2e980 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   failed..    ** 
2e990 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  Return an error.
2e9a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
2e9b0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62   = pTabList->a[b
2e9c0 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20  estJ].pIndex;.  
2e9d0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2e9e0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2e9f0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2ea00 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
2ea10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2ea20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ea30 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
2ea40 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49  e index: %s", pI
2ea50 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2ea60 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2ea70 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  ginError;.      
2ea80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2ea90 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
2eaa0 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65  BY clause is use
2eab0 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  d, the bestIndex
2eac0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  () function is. 
2ead0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
2eae0 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  teed to find the
2eaf0 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
2eb00 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20   in the INDEXED 
2eb10 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
2eb20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20    ** if it find 
2eb30 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  an index at all.
2eb40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2eb50 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  rt( bestPlan.pla
2eb60 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29  n.u.pIdx==pIdx )
2eb70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2eb80 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
2eb90 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2eba0 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
2ebb0 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ));.  if( pParse
2ebc0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2ebd0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2ebe0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2ebf0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
2ec00 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
2ec10 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
2ec20 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
2ec30 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
2ec40 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
2ec50 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
2ec60 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
2ec70 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
2ec80 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
2ec90 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
2eca0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
2ecb0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
2ecc0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
2ecd0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2ece0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
2ecf0 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
2ed00 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
2ed10 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
2ed20 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
2ed30 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
2ed40 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
2ed50 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
2ed60 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
2ed70 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
2ed80 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2ed90 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
2eda0 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
2edb0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
2edc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2edd0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2ede0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
2edf0 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
2ee00 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2ee10 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2ee20 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46  RED)!=0 && (andF
2ee30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2ee40 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  QUE)!=0 ){.    p
2ee50 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
2ee60 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
2ee70 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[0].plan.wsFl
2ee80 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
2ee90 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  X_ONLY;.  }..  /
2eea0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
2eeb0 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
2eec0 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
2eed0 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
2eee0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
2eef0 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2ef00 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
2ef10 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2ef20 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
2ef30 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
2ef40 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
2ef50 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
2ef60 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f  mask)0;.  pWInfo
2ef70 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75  ->nRowOut = (dou
2ef80 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d 30  ble)1;.  for(i=0
2ef90 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2efa0 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
2efb0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2efc0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2efd0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2efe0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2eff0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2f000 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2f010 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2f020 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ble/index */..  
2f030 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2f040 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2f050 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
2f060 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
2f070 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
2f080 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
2f090 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2f0a0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2f0b0 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  t *= pLevel->pla
2f0c0 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20  n.nRow;.    iDb 
2f0d0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2f0e0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2f0f0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
2f100 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2f110 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2f120 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2f130 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2f140 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2f150 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2f160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2f170 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2f180 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2f190 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2f1a0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2f1b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2f1c0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2f1d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2f1e0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2f1f0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2f200 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2f210 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2f220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f230 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2f240 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2f250 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2f260 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2f270 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2f280 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2f290 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2f2a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2f2b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2f2c0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
2f2d0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2f2e0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
2f2f0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
2f300 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
2f310 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
2f320 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2f330 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2f340 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2f350 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
2f360 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
2f370 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2f380 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
2f390 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2f3a0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
2f3b0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
2f3c0 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
2f3d0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2f3e0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
2f3f0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
2f400 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2f410 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
2f420 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
2f430 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f440 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
2f450 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f460 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f480 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
2f490 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
2f4a0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
2f4b0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
2f4c0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
2f4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2f4e0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2f4f0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2f500 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2f510 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
2f520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f530 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2f540 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
2f550 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f560 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2f570 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2f580 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2f590 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2f5a0 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2f5b0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2f5c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
2f5d0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
2f5e0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2f5f0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2f600 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
2f610 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
2f620 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
2f630 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2f640 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
2f650 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
2f660 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
2f670 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
2f680 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2f690 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2f6a0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2f6b0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2f6c0 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
2f6d0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
2f6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f6f0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2f700 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
2f710 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
2f740 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
2f750 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f760 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2f770 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
2f780 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
2f790 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2f7a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2f7b0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
2f7c0 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
2f7d0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
2f7e0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
2f7f0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2f800 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f810 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2f820 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2f830 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2f840 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2f850 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2f860 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2f870 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2f880 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2f890 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2f8a0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2f8b0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2f8c0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2f8d0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2f8e0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2f8f0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2f900 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74  (i=0; i<nTabList
2f910 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76  ; i++){.    pLev
2f920 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2f930 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  i];.    explainO
2f940 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
2f950 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2f960 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
2f970 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
2f980 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
2f990 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2f9a0 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
2f9b0 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
2f9c0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2f9d0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2f9e0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
2f9f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2fa00 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
2fa10 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2fa20 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
2fa30 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
2fa40 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
2fa50 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2fa60 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
2fa70 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
2fa80 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
2fa90 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
2faa0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
2fab0 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
2fac0 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
2fad0 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
2fae0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
2faf0 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
2fb00 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
2fb10 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
2fb20 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
2fb30 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
2fb40 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
2fb50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2fb60 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  abList; i++){.  
2fb70 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
2fb80 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
2fb90 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2fba0 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
2fbb0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2fbc0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2fbd0 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
2fbe0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
2fbf0 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
2fc00 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2fc10 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
2fc20 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
2fc30 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2fc40 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2fc50 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
2fc60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
2fc70 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2fc80 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2fc90 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Y ){.        mem
2fca0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
2fcb0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
2fcc0 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20   "{}", 2);.     
2fcd0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
2fce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fcf0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2fd00 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2fd10 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a  nQPlan], z, n);.
2fd20 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
2fd30 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
2fd40 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
2fd50 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
2fd60 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
2fd70 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
2fd80 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2fd90 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
2fda0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2fdb0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2fdc0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
2fdd0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
2fde0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2fdf0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
2fe00 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
2fe10 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
2fe20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2fe30 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2fe40 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
2fe50 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
2fe60 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
2fe70 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d  lse if( (pLevel-
2fe80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2fe90 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2fea0 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  0 ){.      n = s
2feb0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
2fec0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2fed0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2fee0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2fef0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2ff00 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
2ff10 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2ff20 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2ff30 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
2ff40 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
2ff50 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
2ff60 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
2ff70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ff80 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2ff90 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
2ffa0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2ffb0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
2ffc0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2ffd0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
2ffe0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
2fff0 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  an += 3;.    }. 
30000 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
30010 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
30020 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30030 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
30040 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
30050 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
30060 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
30070 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
30080 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
30090 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
300a0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
300b0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
300c0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
300d0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
300e0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
300f0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
30100 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
30110 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
30120 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
30130 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  rn..  */.  retur
30140 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
30150 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
30160 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
30170 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
30180 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
30190 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
301a0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
301b0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
301c0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
301d0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
301e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
301f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
30200 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30210 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
30220 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
30230 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30240 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
30250 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
30260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30270 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
30280 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
30290 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
302a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
302b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
302c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
302d0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
302e0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
302f0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
30300 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
30310 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
30320 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
30330 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
30340 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
30350 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
30360 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30370 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
30380 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
30390 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
303a0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
303b0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
303c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
303d0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
303e0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
303f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
30400 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
30410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30420 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
30430 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
30440 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
30450 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30460 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
30470 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
30480 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
30490 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
304a0 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
304b0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
304c0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
304d0 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
304e0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
304f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30500 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
30510 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
30520 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
30530 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
30540 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
30550 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
30560 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
30570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30580 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
30590 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
305a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
305b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
305c0 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
305d0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
305e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
305f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
30600 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
30610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30620 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30630 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
30640 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
30650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30660 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
30670 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
30680 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30690 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
306a0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
306b0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
306c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
306d0 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
306e0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
306f0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
30700 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30710 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30720 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
30730 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   || (pLevel->pla
30740 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
30750 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
30760 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
30770 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30780 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30790 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
307a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
307b0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
307c0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
307d0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
307e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
307f0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
30800 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30810 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30820 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
30830 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
30840 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30850 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
30860 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
30870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30880 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30890 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
308a0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
308b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
308c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
308d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
308e0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
308f0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
30900 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
30910 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
30920 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
30930 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
30940 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
30950 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
30960 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
30970 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
30980 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
30990 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
309a0 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
309b0 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
309c0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
309d0 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
309e0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
309f0 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
30a00 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
30a10 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20  o->nLevel==1 || 
30a20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
30a30 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
30a40 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
30a50 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
30a60 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
30a70 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
30a80 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
30a90 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
30aa0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
30ab0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
30ac0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
30ad0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
30ae0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
30af0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
30b00 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
30b10 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
30b20 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
30b30 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
30b40 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
30b50 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30b60 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d  RE_OMIT_CLOSE)==
30b70 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
30b80 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  nt ws = pLevel->
30b90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
30ba0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
30bb0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77  >okOnePass && (w
30bc0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
30bd0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
30be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30bf0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
30c00 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
30c10 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
30c20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
30c30 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
30c40 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54 45  & (ws & WHERE_TE
30c50 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a  MP_INDEX)==0 ){.
30c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30c70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30c80 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
30c90 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
30ca0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30cb0 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
30cc0 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
30cd0 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
30ce0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
30cf0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
30d00 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65  index in prefere
30d10 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nce to the table
30d20 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69  . Sometimes, thi
30d30 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  s means.    ** t
30d40 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65  he table need ne
30d50 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ver be read from
30d60 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66  . This is a perf
30d70 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20  ormance boost,. 
30d80 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62     ** as the vdb
30d90 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e  e level waits un
30da0 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73  til the table is
30db0 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74   read before act
30dc0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65  ually.    ** see
30dd0 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63  king the table c
30de0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63  ursor to the rec
30df0 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ord correspondin
30e00 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
30e10 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
30e20 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
30e30 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
30e40 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
30e50 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
30e60 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
30e70 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
30e80 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
30e90 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
30ea0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
30eb0 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
30ec0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
30ed0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
30ee0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
30ef0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
30f00 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
30f10 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
30f20 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
30f30 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
30f40 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
30f50 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
30f60 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
30f70 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
30f80 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30f90 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
30fa0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
30fb0 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74  iled){.      int
30fc0 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
30fd0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
30fe0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
30ff0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
31000 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20  .u.pIdx;..      
31010 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
31020 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
31030 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
31040 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
31050 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
31060 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
31070 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
31080 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
31090 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
310a0 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
310b0 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
310c0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
310d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
310e0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
310f0 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
31100 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
31110 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
31120 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
31130 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
31140 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
31150 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
31160 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
31170 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
31180 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
31190 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
311a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
311b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
311c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
311d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
311e0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
311f0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
31200 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
31210 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78         || j<pIdx
31220 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
31230 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
31240 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
31250 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
31260 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
31270 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
31280 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
31290 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
312a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
312b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
312c0 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
312d0 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
312e0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
312f0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
31300 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
31310 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
31320 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.