/ Hex Artifact Content
Login

Artifact 51e6657e2d585dfced4c195d6faefe4738d4f1f9:


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 55 4e 51 5f 57  fine WHERE_UNQ_W
2c50: 41 4e 54 45 44 20 20 20 30 78 34 30 30 30 30 30  ANTED   0x400000
2c60: 30 30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 55  00  /* True if U
2c70: 4e 49 51 55 45 20 77 6f 75 6c 64 20 62 65 20 68  NIQUE would be h
2c80: 65 6c 70 66 75 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  elpful */../*.**
2c90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
2ca0: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
2cb0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2cd0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
2ce0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
2cf0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pWC,        /* 
2d00: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
2d10: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
2d20: 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  d */.  Parse *pP
2d30: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2d40: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
2d50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2d60: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2d70: 65 74 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  et   /* Mapping 
2d80: 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f  from table curso
2d90: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
2da0: 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70 57  masks */.){.  pW
2db0: 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  C->pParse = pPar
2dc0: 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b  se;.  pWC->pMask
2dd0: 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a  Set = pMaskSet;.
2de0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30    pWC->nTerm = 0
2df0: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d  ;.  pWC->nSlot =
2e00: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e   ArraySize(pWC->
2e10: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d  aStatic);.  pWC-
2e20: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69  >a = pWC->aStati
2e30: 63 3b 0a 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20  c;.  pWC->vmask 
2e40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  = 0;.}../* Forwa
2e50: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2e60: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2e70: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65  eClauseClear(Whe
2e80: 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a  reClause*);../*.
2e90: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
2ea0: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
2eb0: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
2ec0: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  OrInfo object..*
2ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2ee0: 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28  ereOrInfoDelete(
2ef0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
2f00: 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  reOrInfo *p){.  
2f10: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2f20: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69  (&p->wc);.  sqli
2f30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
2f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2f50: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
2f60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2f70: 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20   a WhereAndInfo 
2f80: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
2f90: 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49  c void whereAndI
2fa0: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2fb0: 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49  3 *db, WhereAndI
2fc0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2fd0: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2fe0: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2ff0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
3000: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
3010: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
3020: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57  tructure.  The W
3030: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
3040: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69  ture.** itself i
3050: 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68  s not freed.  Th
3060: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
3070: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65  e inverse of whe
3080: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
3090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
30a0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
30b0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
30c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
30d0: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71  ereTerm *a;.  sq
30e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d  lite3 *db = pWC-
30f0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66  >pParse->db;.  f
3100: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
3110: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
3120: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
3130: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
3140: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
3150: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3160: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61  ExprDelete(db, a
3170: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
3180: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61      if( a->wtFla
3190: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  gs & TERM_ORINFO
31a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f   ){.      whereO
31b0: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  rInfoDelete(db, 
31c0: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20  a->u.pOrInfo);. 
31d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e     }else if( a->
31e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41  wtFlags & TERM_A
31f0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  NDINFO ){.      
3200: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
3210: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64  te(db, a->u.pAnd
3220: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
3230: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
3240: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
3250: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3260: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
3270: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
3280: 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72   single new Wher
3290: 65 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74  eTerm entry to t
32a0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
32b0: 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68  bject pWC..** Th
32c0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
32d0: 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72  object is constr
32e0: 75 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20  ucted from Expr 
32f0: 70 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61  p and with wtFla
3300: 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  gs..** The index
3310: 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20   in pWC->a[] of 
3320: 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72  the new WhereTer
3330: 6d 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  m is returned on
3340: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69   success..** 0 i
3350: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
3360: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3370: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64  could not be add
3380: 65 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f  ed due to a memo
3390: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
33a0: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d   error.  The mem
33b0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
33c0: 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72  ailure will be r
33d0: 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ecorded in.** th
33e0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
33f0: 65 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20  ed flag so that 
3400: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e  higher-level fun
3410: 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63  ctions can detec
3420: 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t it..**.** This
3430: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
3440: 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
3450: 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  of the pWC->a[] 
3460: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
3470: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ry..**.** If the
3480: 20 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e   wtFlags argumen
3490: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
34a0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
34b0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
34c0: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
34d0: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
34e0: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
34f0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
3500: 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69  t pWC..** This i
3510: 73 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74  s true even if t
3520: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
3530: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  s to allocate a 
3540: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  new WhereTerm..*
3550: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
3560: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
3570: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
3580: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
3590: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
35a0: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
35b0: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
35c0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
35d0: 64 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63  dated after.** c
35e0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
35f0: 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74  ine.  Such point
3600: 65 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69  ers may be reini
3610: 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65  tialized by refe
3620: 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70  rencing.** the p
3630: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a  WC->a[] array..*
3640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
3650: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57  reClauseInsert(W
3660: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
3670: 20 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46   Expr *p, u8 wtF
3680: 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65  lags){.  WhereTe
3690: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
36a0: 20 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65   idx;.  testcase
36b0: 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ( wtFlags & TERM
36c0: 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20  _VIRTUAL );  /* 
36d0: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
36e0: 30 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e  0 */.  if( pWC->
36f0: 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f  nTerm>=pWC->nSlo
3700: 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  t ){.    WhereTe
3710: 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e  rm *pOld = pWC->
3720: 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  a;.    sqlite3 *
3730: 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  db = pWC->pParse
3740: 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61  ->db;.    pWC->a
3750: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3760: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
3770: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
3780: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
3790: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
37a0: 0a 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61  .      if( wtFla
37b0: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
37c0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
37d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
37e0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, p);.      }. 
37f0: 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f       pWC->a = pO
3800: 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ld;.      return
3810: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65   0;.    }.    me
3820: 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c  mcpy(pWC->a, pOl
3830: 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  d, sizeof(pWC->a
3840: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29  [0])*pWC->nTerm)
3850: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d  ;.    if( pOld!=
3860: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
3870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3880: 72 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20  ree(db, pOld);. 
3890: 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53     }.    pWC->nS
38a0: 6c 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  lot = sqlite3DbM
38b0: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57  allocSize(db, pW
38c0: 43 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43  C->a)/sizeof(pWC
38d0: 2d 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70  ->a[0]);.  }.  p
38e0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
38f0: 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  dx = pWC->nTerm+
3900: 2b 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78  +];.  pTerm->pEx
3910: 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d  pr = p;.  pTerm-
3920: 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61  >wtFlags = wtFla
3930: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
3940: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
3950: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
3960: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
3970: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3980: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
3990: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
39a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
39b0: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
39c0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
39d0: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
39e0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
39f0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
3a00: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
3a10: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
3a20: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
3a30: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
3a40: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
3a50: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
3a60: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
3a70: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
3a80: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
3a90: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
3aa0: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
3ab0: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
3ac0: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
3ad0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
3ae0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
3af0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
3b00: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
3b10: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
3b30: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
3b40: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
3b50: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
3b60: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
3b70: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
3b80: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
3b90: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
3ba0: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
3bb0: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
3bc0: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
3bd0: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
3be0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
3bf0: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
3c00: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
3c10: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
3c20: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
3c30: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
3c40: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
3c50: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
3c60: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
3c70: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
3c80: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
3c90: 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c  ic void whereSpl
3ca0: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
3cb0: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
3cc0: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43  , int op){.  pWC
3cd0: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
3ce0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
3cf0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
3d00: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
3d10: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
3d20: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
3d30: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
3d40: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
3d50: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
3d60: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
3d70: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
3d80: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
3d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
3da0: 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69  lize an expressi
3db0: 6f 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57  on mask set (a W
3dc0: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
3dd0: 63 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ct).*/.#define i
3de0: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d  nitMaskSet(P)  m
3df0: 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65  emset(P, 0, size
3e00: 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52  of(*P))../*.** R
3e10: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
3e20: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
3e30: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
3e40: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
3e50: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
3e60: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
3e70: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
3e80: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
3e90: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
3ea0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
3eb0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
3ec0: 73 6b 53 65 74 2d 3e 6e 3c 3d 73 69 7a 65 6f 66  skSet->n<=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 20 26 26 20 70 45 78 70 72 2d  OTNULL && pExpr-
c760: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e  >pLeft->iColumn>
c770: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
c780: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
c790: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
c7a0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
c7b0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
c7c0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
c7d0: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
c7e0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c7f0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c820: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
c830: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
c860: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
c870: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
c880: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
c890: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
c8a0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
c8d0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
c8e0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
c8f0: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
c900: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
c910: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
c920: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
c930: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
c940: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
c950: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
c960: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c970: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c980: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
c990: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
c9a0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
c9b0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c9c0: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
c9d0: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
c9e0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c9f0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
ca00: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
ca10: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
ca20: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
ca30: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
ca40: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
ca50: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
ca60: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
ca70: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
ca80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ca90: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a  E_ENABLE_STAT2 *
caa0: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
cab0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
cac0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
cad0: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
cae0: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
caf0: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
cb00: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
cb10: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
cb20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
cb30: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
cb40: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
cb50: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f  rn TRUE if any o
cb60: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
cb70: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46  s in pList->a[iF
cb80: 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e  irst...] contain
cb90: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
cba0: 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68  to any table oth
cbb0: 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73  er than the iBas
cbc0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
cbd0: 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65  ic int reference
cbe0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20  sOtherTables(.  
cbf0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
cc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
cc10: 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  rch expressions 
cc20: 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20  in ths list */. 
cc30: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
cc40: 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61  MaskSet,   /* Ma
cc50: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
cc60: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
cc70: 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cc90: 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68  e searching with
cca0: 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65   the iFirst-th e
ccb0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
ccc0: 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20  nt iBase        
ccd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
cce0: 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
ccf0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
cd00: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f  {.  Bitmask allo
cd10: 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70  wed = ~getMask(p
cd20: 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b  MaskSet, iBase);
cd30: 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74  .  while( iFirst
cd40: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  <pList->nExpr ){
cd50: 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61  .    if( (exprTa
cd60: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
cd70: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  t, pList->a[iFir
cd80: 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c  st++].pExpr)&all
cd90: 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  owed)!=0 ){.    
cda0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cdb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
cdc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
cdd0: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
cde0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
cdf0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
ce00: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
ce10: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
ce20: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
ce30: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
ce40: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
ce50: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ce60: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
ce70: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
ce80: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
ce90: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
cea0: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
ceb0: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
cec0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
ced0: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
cee0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
cef0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
cf00: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
cf10: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
cf20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
cf30: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
cf40: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
cf50: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
cf60: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cf70: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
cf80: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
cf90: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
cfa0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
cfb0: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
cfc0: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
cfd0: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
cfe0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
cff0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
d000: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
d010: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
d020: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
d030: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
d040: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
d050: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
d060: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
d070: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
d080: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
d090: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
d0a0: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
d0b0: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
d0c0: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
d0d0: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
d0e0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
d0f0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
d100: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d110: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
d120: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
d130: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
d140: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
d150: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
d160: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
d170: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
d180: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d190: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d1a0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
d1b0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
d1c0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
d1d0: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
d1e0: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
d1f0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
d200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d210: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
d220: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
d230: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
d240: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
d250: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
d260: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
d270: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d280: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
d290: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
d2a0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
d2b0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
d2c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
d2d0: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
d2e0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
d2f0: 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73  */.  int wsFlags
d300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d310: 49 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61  Index usages fla
d320: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  gs */.  int *pbR
d330: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
d340: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
d350: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
d360: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
d370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d380: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d390: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
d3a0: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3c0: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
d3d0: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
d3e0: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
d3f0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
d420: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
d430: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d440: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
d450: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
d460: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d470: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d480: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d490: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
d4a0: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
d4b0: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
d4c0: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
d4d0: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
d4e0: 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d 75  Argument pIdx mu
d4f0: 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20  st either point 
d500: 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d 65  to a 'real' name
d510: 64 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  d index structur
d520: 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69  e, .  ** or an i
d530: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
d540: 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
d550: 73 74 61 63 6b 20 62 79 20 62 65 73 74 42 74 72  stack by bestBtr
d560: 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a  eeIndex() to.  *
d570: 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  * represent the 
d580: 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61 74  rowid index that
d590: 20 69 73 20 70 61 72 74 20 6f 66 20 65 76 65 72   is part of ever
d5a0: 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61  y table.  */.  a
d5b0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61  ssert( pIdx->zNa
d5c0: 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f  me || (pIdx->nCo
d5d0: 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d  lumn==1 && pIdx-
d5e0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31  >aiColumn[0]==-1
d5f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68  ) );..  /* Match
d600: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
d610: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 67  DER BY clause ag
d620: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  ainst columns of
d630: 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e  .  ** the index.
d640: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
d650: 74 68 61 74 20 69 6e 64 69 63 65 73 20 68 61 76  that indices hav
d660: 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  e pIdx->nColumn 
d670: 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20  regular columns 
d680: 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64  plus.  ** one ad
d690: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  ditional column 
d6a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
d6b0: 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64  owid.  The rowid
d6c0: 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20   column.  ** of 
d6d0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73  the index is als
d6e0: 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  o allowed to mat
d6f0: 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f  ch against the O
d700: 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
d710: 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  use..  */.  for(
d720: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72  i=j=0, pTerm=pOr
d730: 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72  derBy->a; j<nTer
d740: 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43  m && i<=pIdx->nC
d750: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
d760: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
d770: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
d780: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44  ssion of the ORD
d790: 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20  ER BY pTerm */. 
d7a0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
d7b0: 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  l;    /* The col
d7c0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
d7d0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  of pExpr */.    
d7e0: 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  int termSortOrde
d7f0: 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72  r; /* Sort order
d800: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
d810: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
d820: 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  n;       /* The 
d830: 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i-th column of t
d840: 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f  he index.  -1 fo
d850: 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  r rowid */.    i
d860: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20  nt iSortOrder;  
d870: 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c    /* 1 for DESC,
d880: 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68   0 for ASC on th
d890: 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72  e i-th index ter
d8a0: 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  m */.    const c
d8b0: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e  har *zColl; /* N
d8c0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ame of the colla
d8d0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
d8e0: 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72  r i-th index ter
d8f0: 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20  m */..    pExpr 
d900: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
d910: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
d920: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
d930: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62  pExpr->iTable!=b
d940: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ase ){.      /* 
d950: 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69  Can not use an i
d960: 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79  ndex sort on any
d970: 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  thing that is no
d980: 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  t a column in th
d990: 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d  e.      ** left-
d9a0: 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68  most table of th
d9b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
d9c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d9d0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20    }.    pColl = 
d9e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
d9f0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
da00: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
da10: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
da20: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
da30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
da40: 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 69  pIdx->zName && i
da50: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
da60: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  {.      iColumn 
da70: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
da80: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69  [i];.      if( i
da90: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54  Column==pIdx->pT
daa0: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  able->iPKey ){. 
dab0: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
dac0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
dad0: 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20     iSortOrder = 
dae0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
daf0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  [i];.      zColl
db00: 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
db10: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
db20: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
db30: 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72  1;.      iSortOr
db40: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  der = 0;.      z
db50: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll = pColl->zN
db60: 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ame;.    }.    i
db70: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
db80: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71  n!=iColumn || sq
db90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
dba0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
dbb0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65  ) ){.      /* Te
dbc0: 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45  rm j of the ORDE
dbd0: 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  R BY clause does
dbe0: 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d   not match colum
dbf0: 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78  n i of the index
dc00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c   */.      if( i<
dc10: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
dc20: 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78    /* If an index
dc30: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20   column that is 
dc40: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
dc50: 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68  = fails to match
dc60: 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   an.        ** O
dc70: 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68  RDER BY term, th
dc80: 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20  at is OK.  Just 
dc90: 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75  ignore that colu
dca0: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  mn of the index.
dcb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
dcc0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
dcd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d     }else if( i==
dce0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
dcf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  .        /* Inde
dd00: 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68  x column i is th
dd10: 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74  e rowid.  All ot
dd20: 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68 2e  her terms match.
dd30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
dd40: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
dd50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
dd60: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
dd70: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
dd80: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
dd90: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
dda0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
ddb0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
ddc0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
ddd0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
dde0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
ddf0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
de00: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
de10: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
de20: 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d  der!=0 || iColum
de30: 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  n==-1 );.    ass
de40: 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74  ert( pTerm->sort
de50: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72  Order==0 || pTer
de60: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  m->sortOrder==1 
de70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
de80: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  SortOrder==0 || 
de90: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b  iSortOrder==1 );
dea0: 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
deb0: 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20  er = iSortOrder 
dec0: 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ^ pTerm->sortOrd
ded0: 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45  er;.    if( i>nE
dee0: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  qCol ){.      if
def0: 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
df00: 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
df10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73        /* Indices
df20: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
df30: 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  d if all ORDER B
df40: 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  Y terms past the
df50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61  .        ** equa
df60: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
df70: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
df80: 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a  DESC or ASC. */.
df90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
dfa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
dfb0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f  lse{.      sortO
dfc0: 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f  rder = termSortO
dfd0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
dfe0: 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b  j++;.    pTerm++
dff0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
e000: 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63  n<0 && !referenc
e010: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
e020: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
e030: 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , j, base) ){.  
e040: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
e050: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  dexed column is 
e060: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
e070: 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d  and everything m
e080: 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20  atches.      ** 
e090: 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20  so far and none 
e0a0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
e0b0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67  terms to the rig
e0c0: 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68  ht reference oth
e0d0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  er.      ** tabl
e0e0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
e0f0: 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75  then we are assu
e100: 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64  red that the ind
e110: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  ex can be used .
e120: 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74        ** to sort
e130: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69   because the pri
e140: 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71  mary key is uniq
e150: 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f  ue and so none o
e160: 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  f the other.    
e170: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c    ** columns wil
e180: 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65  l make any diffe
e190: 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20  rence.      */. 
e1a0: 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a       j = nTerm;.
e1b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62      }.  }..  *pb
e1c0: 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21  Rev = sortOrder!
e1d0: 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65  =0;.  if( j>=nTe
e1e0: 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  rm ){.    /* All
e1f0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
e200: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
e210: 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69  e covered by thi
e220: 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a  s index so.    *
e230: 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e  * this index can
e240: 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72   be used for sor
e250: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ting. */.    ret
e260: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
e270: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
e280: 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49  OE_None && i==pI
e290: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  dx->nColumn.    
e2a0: 20 20 26 26 20 28 77 73 46 6c 61 67 73 20 26 20    && (wsFlags & 
e2b0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
e2c0: 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 21  L)==0.      && !
e2d0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
e2e0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
e2f0: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
e300: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  e) ){.    /* All
e310: 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69   terms of this i
e320: 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20  ndex match some 
e330: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52  prefix of the OR
e340: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
e350: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
e360: 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64  ex is UNIQUE and
e370: 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65   no terms on the
e380: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44   tail of the ORD
e390: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
e3a0: 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74  use reference ot
e3b0: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20  her tables in a 
e3c0: 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69  join.  If this i
e3d0: 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a  s all true then.
e3e0: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72      ** the order
e3f0: 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75   by clause is su
e400: 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e 6f 74 20  perfluous.  Not 
e410: 74 68 61 74 20 69 66 20 74 68 65 20 6d 61 74 63  that if the matc
e420: 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63 6f 6e 64  hing.    ** cond
e430: 69 74 69 6f 6e 20 69 73 20 49 53 20 4e 55 4c 4c  ition is IS NULL
e440: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e450: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e460: 69 6c 79 20 75 6e 69 71 75 65 0a 20 20 20 20 2a  ily unique.    *
e470: 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55 4e 49 51  * even on a UNIQ
e480: 55 45 20 69 6e 64 65 78 2c 20 73 6f 20 64 69 73  UE index, so dis
e490: 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63 61 73 65  allow those case
e4a0: 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  s. */.    return
e4b0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
e4c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   0;.}../*.** Pre
e4d0: 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74  pare a crude est
e4e0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67  imate of the log
e4f0: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
e500: 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  put value..** Th
e510: 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e  e results need n
e520: 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68  ot be exact.  Th
e530: 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  is is only used 
e540: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a  for estimating.*
e550: 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74  * the total cost
e560: 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f   of performing o
e570: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f  perations with O
e580: 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67  (logN) or O(Nlog
e590: 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79  N).** complexity
e5a0: 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20  .  Because N is 
e5b0: 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74  just a guess, it
e5c0: 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61   is no great tra
e5d0: 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20  gedy if.** logN 
e5e0: 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e  is a little off.
e5f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
e600: 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20  e estLog(double 
e610: 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67  N){.  double log
e620: 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20  N = 1;.  double 
e630: 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28  x = 10;.  while(
e640: 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e   N>x ){.    logN
e650: 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20   += 1;.    x *= 
e660: 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  10;.  }.  return
e670: 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   logN;.}../*.** 
e680: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
e690: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
e6a0: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
e6b0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
e6c0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
e6d0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
e6e0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
e6f0: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
e700: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
e710: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
e720: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
e730: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
e740: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
e750: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
e760: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
e770: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
e780: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
e790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
e7a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
e7b0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e7c0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e7d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
e7e0: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
e7f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e800: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
e810: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e820: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
e830: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
e840: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
e850: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
e860: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e870: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e880: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
e890: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e8a0: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
e8b0: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
e8c0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
e8d0: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
e8e0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
e8f0: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
e900: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
e910: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
e920: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e930: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
e940: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
e950: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
e960: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
e970: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
e980: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e990: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
e9a0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
e9b0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
e9c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
e9d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e9e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
e9f0: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
ea00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ea10: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
ea20: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ea30: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
ea40: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
ea50: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
ea60: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
ea70: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
ea80: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
ea90: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
eaa0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
eab0: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
eac0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
ead0: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
eae0: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
eaf0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
eb00: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
eb10: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
eb20: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
eb30: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
eb40: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
eb50: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
eb60: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
eb70: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
eb80: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
eb90: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
eba0: 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  st);.}.#else.#de
ebb0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
ebc0: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
ebd0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
ebe0: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TS(A).#endif../*
ebf0: 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65   .** Required be
ec00: 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28  cause bestIndex(
ec10: 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62  ) is called by b
ec20: 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
ec30: 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  () .*/.static vo
ec40: 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20  id bestIndex(.  
ec50: 20 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43    Parse*, WhereC
ec60: 6c 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53  lause*, struct S
ec70: 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a 20 20  rcList_item*,.  
ec80: 20 20 42 69 74 6d 61 73 6b 2c 20 42 69 74 6d 61    Bitmask, Bitma
ec90: 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57  sk, ExprList*, W
eca0: 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a  hereCost*);../*.
ecb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ecc0: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
ecd0: 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72   an scanning str
ece0: 61 74 65 67 79 20 74 68 61 74 20 63 61 6e 20 62  ategy that can b
ecf0: 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70  e used .** to op
ed00: 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65  timize an 'OR' e
ed10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
ed20: 73 20 70 61 72 74 20 6f 66 20 61 20 57 48 45 52  s part of a WHER
ed30: 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a  E clause. .**.**
ed40: 20 54 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63   The table assoc
ed50: 69 61 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20  iated with FROM 
ed60: 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53 72 63  clause term pSrc
ed70: 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
ed80: 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72  .** regular B-Tr
ed90: 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69  ee table or a vi
eda0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
edb0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
edc0: 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20  OrClauseIndex(. 
edd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
edf0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
ee00: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
ee10: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
ee20: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
ee30: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
ee40: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
ee50: 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
ee60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
ee70: 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
ee80: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
ee90: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
eea0: 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
eeb0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
eec0: 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
eed0: 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
eee0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
eef0: 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
ef00: 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
ef10: 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
ef20: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
ef30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
ef40: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
ef50: 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
ef60: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
ef70: 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
ef80: 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69  ry plan */.){.#i
ef90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
efa0: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
efb0: 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43  N.  const int iC
efc0: 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  ur = pSrc->iCurs
efd0: 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or;   /* The cur
efe0: 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
eff0: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20   to be accessed 
f000: 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61  */.  const Bitma
f010: 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74  sk maskSrc = get
f020: 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
f030: 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42  et, iCur);  /* B
f040: 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20  itmask for pSrc 
f050: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
f060: 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20   const pWCEnd = 
f070: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
f080: 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  rm];        /* E
f090: 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a  nd of pWC->a[] *
f0a0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
f0b0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
f0c0: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
f0d0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
f0e0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20  ERE clause */.. 
f0f0: 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75 73 65   /* No OR-clause
f100: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c   optimization al
f110: 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49 4e 44  lowed if the IND
f120: 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
f130: 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73 0a 20  NDEXED clauses. 
f140: 20 2a 2a 20 61 72 65 20 75 73 65 64 20 2a 2f 0a   ** are used */.
f150: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
f160: 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e  ndexed || pSrc->
f170: 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20  pIndex!=0 ){.   
f180: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
f190: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48  /* Search the WH
f1a0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
f1b0: 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f   for a usable WO
f1c0: 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66  _OR term. */.  f
f1d0: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
f1e0: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
f1f0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
f200: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
f210: 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26  r==WO_OR .     &
f220: 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  & ((pTerm->prere
f230: 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29  qAll & ~maskSrc)
f240: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
f250: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
f260: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
f270: 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21  able & maskSrc)!
f280: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
f290: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
f2a0: 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
f2b0: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
f2c0: 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
f2d0: 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
f2e0: 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
f2f0: 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
f300: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
f310: 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
f320: 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52  int flags = WHER
f330: 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
f340: 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20    double rTotal 
f350: 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  = 0;.      doubl
f360: 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  e nRow = 0;.    
f370: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
f380: 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70   0;..      for(p
f390: 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
f3a0: 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
f3b0: 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
f3c0: 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74         WhereCost
f3d0: 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20   sTermCost;.    
f3e0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
f3f0: 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78  "... Multi-index
f400: 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20   OR testing for 
f410: 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e  term %d of %d...
f420: 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .\n", .         
f430: 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57   (pOrTerm - pOrW
f440: 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20  C->a), (pTerm - 
f450: 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20  pWC->a).        
f460: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
f470: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
f480: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or==WO_AND ){.  
f490: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
f4a0: 75 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70  use *pAndWC = &p
f4b0: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
f4c0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
f4d0: 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
f4e0: 73 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63  se, pAndWC, pSrc
f4f0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
f500: 61 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43  alid, 0, &sTermC
f510: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ost);.        }e
f520: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
f530: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
f540: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  r ){.          W
f550: 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
f560: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  C;.          tem
f570: 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43  pWC.pParse = pWC
f580: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
f590: 20 20 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b      tempWC.pMask
f5a0: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
f5b0: 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Set;.          t
f5c0: 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
f5d0: 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
f5e0: 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b  pWC.a = pOrTerm;
f5f0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
f600: 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  C.nTerm = 1;.   
f610: 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
f620: 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43  (pParse, &tempWC
f630: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
f640: 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26  , notValid, 0, &
f650: 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20  sTermCost);.    
f660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f670: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f690: 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d   rTotal += sTerm
f6a0: 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20  Cost.rCost;.    
f6b0: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72      nRow += sTer
f6c0: 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  mCost.plan.nRow;
f6d0: 0a 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d  .        used |=
f6e0: 20 73 54 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b   sTermCost.used;
f6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 54 6f  .        if( rTo
f700: 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  tal>=pCost->rCos
f710: 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
f720: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
f730: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
f740: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63  R BY clause, inc
f750: 72 65 61 73 65 20 74 68 65 20 73 63 61 6e 20 63  rease the scan c
f760: 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a  ost to account .
f770: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
f780: 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72   cost of the sor
f790: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
f7a0: 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20  pOrderBy!=0 ){. 
f7b0: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
f7c0: 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20  E(("... sorting 
f7d0: 69 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73  increases OR cos
f7e0: 74 20 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e  t %.9g to %.9g\n
f7f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f800: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72         rTotal, r
f810: 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f  Total+nRow*estLo
f820: 67 28 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20  g(nRow)));.     
f830: 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f     rTotal += nRo
f840: 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a  w*estLog(nRow);.
f850: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f860: 2a 20 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66  * If the cost of
f870: 20 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20   scanning using 
f880: 74 68 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72  this OR term for
f890: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
f8a0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  .      ** less t
f8b0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
f8c0: 63 6f 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70  cost stored in p
f8d0: 43 6f 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68  Cost, replace th
f8e0: 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20  e contents.     
f8f0: 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f   ** of pCost. */
f900: 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
f910: 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e  E(("... multi-in
f920: 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67  dex OR cost=%.9g
f930: 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72   nrow=%.9g\n", r
f940: 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20  Total, nRow));. 
f950: 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c       if( rTotal<
f960: 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a  pCost->rCost ){.
f970: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72          pCost->r
f980: 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20  Cost = rTotal;. 
f990: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73         pCost->us
f9a0: 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20  ed = used;.     
f9b0: 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
f9c0: 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
f9d0: 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
f9e0: 77 73 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  wsFlags = flags;
f9f0: 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
fa00: 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70  plan.u.pTerm = p
fa10: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
fa20: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
fa30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
fa40: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
fa50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
fa60: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
fa70: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
fa80: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
fa90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
faa0: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
fab0: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
fac0: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
fad0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
fae0: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
faf0: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
fb00: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
fb10: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
fb20: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
fb30: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
fb40: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
fb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
fb60: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
fb70: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
fb80: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
fb90: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
fba0: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
fbb0: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
fbc0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
fbd0: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
fbe0: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
fbf0: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
fc00: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
fc10: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
fc20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
fc30: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
fc40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fc50: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fc60: 72 21 3d 57 4f 5f 45 51 20 29 20 72 65 74 75 72  r!=WO_EQ ) retur
fc70: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72  n 0;.  if( (pTer
fc80: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
fc90: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
fca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20  return 0;.  aff 
fcb0: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43  = pSrc->pTab->aC
fcc0: 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  ol[pTerm->u.left
fcd0: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
fce0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
fcf0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
fd00: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66  pTerm->pExpr, af
fd10: 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  f) ) return 0;. 
fd20: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
fd30: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
fd40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
fd50: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49  IC_INDEX./*.** I
fd60: 66 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  f the query plan
fd70: 20 66 6f 72 20 70 53 72 63 20 73 70 65 63 69 66   for pSrc specif
fd80: 69 65 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20  ied in pCost is 
fd90: 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
fda0: 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e  n.** and indexin
fdb0: 67 20 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20  g is allows (if 
fdc0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20  there is no NOT 
fdd0: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 29 20  INDEXED clause) 
fde0: 61 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62  and it.** possib
fdf0: 6c 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  le to construct 
fe00: 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  a transient inde
fe10: 78 20 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72  x that would per
fe20: 66 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74  form better.** t
fe30: 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65  han a full table
fe40: 20 73 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20   scan even when 
fe50: 74 68 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73  the cost of cons
fe60: 74 72 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64  tructing the ind
fe70: 65 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69  ex.** is taken i
fe80: 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65  nto account, the
fe90: 6e 20 61 6c 74 65 72 20 74 68 65 20 71 75 65 72  n alter the quer
fea0: 79 20 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68  y plan to use th
feb0: 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69  e.** transient i
fec0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
fed0: 76 6f 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74  void bestAutomat
fee0: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
fef0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ff00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ff10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ff20: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
ff30: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
ff40: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
ff50: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
ff60: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
ff70: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
ff80: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
ff90: 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
ffa0: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
ffb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
ffc0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
ffd0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
ffe0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
fff0: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
10000 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
10010 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
10020 7b 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c  {.  double nTabl
10030 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  eRow;           
10040 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69  /* Rows in the i
10050 6e 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  nput table */.  
10060 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20  double logN;    
10070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
10080 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f  og(nTableRow) */
10090 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65  .  double costTe
100a0 6d 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f  mpIdx;         /
100b0 2a 20 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74  * per-query cost
100c0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e   of the transien
100d0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  t index */.  Whe
100e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
100f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
10100 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
10110 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10120 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
10130 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
10140 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10150 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  ] */.  Table *pT
10160 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
10170 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20     /* Table tht 
10180 6d 69 67 68 74 20 62 65 20 69 6e 64 65 78 65 64  might be indexed
10190 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 50 61 72   */..  if( (pPar
101a0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
101b0 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
101c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  )==0 ){.    /* A
101d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
101e0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 61 74   are disabled at
101f0 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20   run-time */.   
10200 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
10210 66 28 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  f( (pCost->plan.
10220 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
10230 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30  NOT_FULLSCAN)!=0
10240 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c   ){.    /* We al
10250 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20  ready have some 
10260 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e  kind of index in
10270 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75   use for this qu
10280 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ery. */.    retu
10290 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  rn;.  }.  if( pS
102a0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29  rc->notIndexed )
102b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54  {.    /* The NOT
102c0 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
102d0 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53  appears in the S
102e0 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  QL. */.    retur
102f0 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
10300 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  ( pParse->nQuery
10310 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29  Loop >= (double)
10320 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  1 );.  pTable = 
10330 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54  pSrc->pTab;.  nT
10340 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65  ableRow = pTable
10350 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67  ->nRowEst;.  log
10360 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c  N = estLog(nTabl
10370 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d  eRow);.  costTem
10380 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e  pIdx = 2*logN*(n
10390 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d  TableRow/pParse-
103a0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29  >nQueryLoop + 1)
103b0 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70  ;.  if( costTemp
103c0 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  Idx>=pCost->rCos
103d0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
103e0 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67  cost of creating
103f0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
10400 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72  able would be gr
10410 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  eater than.    *
10420 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c  * doing the full
10430 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
10440 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
10450 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
10460 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d  any equality com
10470 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a  parison term */.
10480 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
10490 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
104a0 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
104b0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
104c0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
104d0 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
104e0 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
104f0 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
10500 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10510 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65  (("auto-index re
10520 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20  duces cost from 
10530 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c  %.1f to %.1f\n",
10540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10550 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
10560 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29  t, costTempIdx))
10570 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  ;.      pCost->r
10580 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49  Cost = costTempI
10590 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  dx;.      pCost-
105a0 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67  >plan.nRow = log
105b0 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f  N + 1;.      pCo
105c0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
105d0 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   = WHERE_TEMP_IN
105e0 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  DEX;.      pCost
105f0 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  ->used = pTerm->
10600 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
10610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10620 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
10630 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
10640 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c  icIndex(A,B,C,D,
10650 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  E)  /* no-op */.
10660 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10670 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
10680 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64  INDEX */...#ifnd
10690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
106a0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
106b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
106c0 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
106d0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
106e0 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
106f0 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
10700 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
10710 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
10720 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
10730 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
10740 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
10750 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
10760 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
10770 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
10780 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
10790 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
107a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
107b0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
107c0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
107d0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
107e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
107f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
10800 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10810 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
10820 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10830 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
10840 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
10850 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
10860 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10870 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
10880 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
10890 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
108a0 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
108b0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
108c0 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
108d0 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
10900 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
10910 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
10920 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
10930 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
10940 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
10950 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10960 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
10970 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
10980 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
10990 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
109a0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
109b0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
109c0 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
109d0 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
109e0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
109f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
10a00 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
10a10 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
10a20 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
10a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a40 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
10a50 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10a60 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10a70 0a 20 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74  .  int regIsInit
10a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10a90 2a 20 52 65 67 69 73 74 65 72 20 73 65 74 20 62  * Register set b
10aa0 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
10ab0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
10ac0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
10ad0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10ae0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10af0 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
10b00 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
10b10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10b20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
10b30 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
10b40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
10b50 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
10b60 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
10b70 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
10b80 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
10b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ba0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
10bb0 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
10bc0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
10bd0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
10be0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10bf0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
10c00 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
10c30 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
10c40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
10c50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10c60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
10c70 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
10c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
10c90 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
10ca0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
10cb0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cd0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
10ce0 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
10cf0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  n */.  Bitmask i
10d00 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
10d10 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
10d20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
10d30 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
10d40 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
10d50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
10d60 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
10d70 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  al columns */.. 
10d80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
10d90 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
10da0 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
10db0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
10dc0 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
10dd0 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
10de0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
10df0 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
10e00 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
10e10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10e20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10e30 29 3b 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d  );.  regIsInit =
10e40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
10e50 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71  .  addrInit = sq
10e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10e70 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49  v, OP_If, regIsI
10e80 6e 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nit);.  sqlite3V
10e90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10ea0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49  Integer, 1, regI
10eb0 73 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f  sInit);..  /* Co
10ec0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
10ed0 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
10ee0 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
10ef0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
10f00 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
10f10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
10f20 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
10f30 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54  Column = 0;.  pT
10f40 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
10f50 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
10f60 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
10f70 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  ];.  idxCols = 0
10f80 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
10f90 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
10fa0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
10fb0 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
10fc0 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
10fd0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
10fe0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
10ff0 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
11000 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
11010 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
11020 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
11030 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
11040 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
11050 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  iCol;.      test
11060 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
11070 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11080 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
11090 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
110a0 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
110b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   ){.        nCol
110c0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  umn++;.        i
110d0 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
110e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
110f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
11100 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76  lumn>0 );.  pLev
11110 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  el->plan.nEq = n
11120 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f  Column;..  /* Co
11130 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
11140 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
11150 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
11160 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
11170 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
11180 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
11190 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
111a0 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
111b0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
111c0 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
111d0 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
111e0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
111f0 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
11200 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
11210 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
11220 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
11230 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
11240 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
11250 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
11260 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
11270 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
11280 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
11290 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
112a0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
112b0 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
112c0 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
112d0 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
112e0 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
112f0 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
11300 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
11310 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61  xCols | (((Bitma
11320 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29  sk)1)<<(BMS-1)))
11330 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
11340 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
11350 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
11360 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
11370 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
11380 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
11390 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
113a0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
113b0 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
113c0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
113d0 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
113e0 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
113f0 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d  )1)<<i) ) nColum
11400 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n++;.  }.  if( p
11410 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
11420 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
11430 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43  MS-1)) ){.    nC
11440 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
11450 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
11460 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  .  }.  pLevel->p
11470 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
11480 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
11490 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
114a0 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43  | WO_EQ;..  /* C
114b0 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
114c0 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
114d0 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
114e0 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   */.  nByte = si
114f0 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e  zeof(Index);.  n
11500 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
11510 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20  sizeof(int);    
11520 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
11530 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d  mn */.  nByte +=
11540 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28   nColumn*sizeof(
11550 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64  char*);   /* Ind
11560 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e  ex.azColl */.  n
11570 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b  Byte += nColumn;
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
115a0 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d  rder */.  pIdx =
115b0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
115c0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
115d0 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70   nByte);.  if( p
115e0 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
115f0 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  .  pLevel->plan.
11600 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
11610 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
11620 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d  (char**)&pIdx[1]
11630 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
11640 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78  mn = (int*)&pIdx
11650 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e  ->azColl[nColumn
11660 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  ];.  pIdx->aSort
11670 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
11680 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  dx->aiColumn[nCo
11690 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a  lumn];.  pIdx->z
116a0 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
116b0 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  ex";.  pIdx->nCo
116c0 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  lumn = nColumn;.
116d0 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
116e0 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
116f0 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
11700 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
11710 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
11720 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
11730 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
11740 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
11750 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
11760 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
11770 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11780 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
11790 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
117a0 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
117b0 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
117c0 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
117d0 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Col;.      if( (
117e0 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
117f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
11800 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
11810 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
11820 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
11830 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
11840 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
11850 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
11860 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
11870 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
11880 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
11890 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
118a0 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
118b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
118c0 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 50 61 72 73  Coll!=0 || pPars
118d0 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20  e->nErr>0 );.   
118e0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
118f0 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  l[n] = pColl ? p
11900 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  Coll->zName : "B
11910 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
11920 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
11930 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
11940 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d   (u32)n==pLevel-
11950 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20  >plan.nEq );..  
11960 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61  /* Add additiona
11970 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  l columns needed
11980 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74   to make the aut
11990 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74  omatic index int
119a0 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e  o.  ** a coverin
119b0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72  g index */.  for
119c0 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
119d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
119e0 65 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42  extraCols & (((B
119f0 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b  itmask)1)<<i) ){
11a00 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43  .      pIdx->aiC
11a10 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20  olumn[n] = i;.  
11a20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
11a30 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [n] = "BINARY";.
11a40 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
11a50 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d  .  }.  if( pSrc-
11a60 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69  >colUsed & (((Bi
11a70 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
11a80 29 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  )) ){.    for(i=
11a90 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d  BMS-1; i<pTable-
11aa0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
11ab0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
11ac0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
11ad0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
11ae0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
11af0 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
11b00 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43  .  assert( n==nC
11b10 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43  olumn );..  /* C
11b20 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
11b30 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70  tic index */.  p
11b40 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65  Keyinfo = sqlite
11b50 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
11b60 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61  arse, pIdx);.  a
11b70 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
11b80 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73  IdxCur>=0 );.  s
11b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ba0 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
11bb0 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
11bc0 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31  dxCur, nColumn+1
11bd0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
11be0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
11bf0 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyinfo, P4_KEY
11c00 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
11c10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11c20 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c   "for %s", pTabl
11c30 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  e->zName));..  /
11c40 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d  * Fill the autom
11c50 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20  atic index with 
11c60 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64  content */.  add
11c70 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11c80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
11c90 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  ewind, pLevel->i
11ca0 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65  TabCur);.  regRe
11cb0 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
11cc0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11cd0 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
11ce0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
11cf0 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c  se, pIdx, pLevel
11d00 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65  ->iTabCur, regRe
11d10 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69  cord, 1);.  sqli
11d20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11d30 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
11d40 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
11d50 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
11d60 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11d70 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
11d80 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
11d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11da0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76  v, OP_Next, pLev
11db0 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64  el->iTabCur, add
11dc0 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74  rTop+1);.  sqlit
11dd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11de0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
11df0 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
11e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11e10 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
11e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
11e30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11e40 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
11e50 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65   .  /* Jump here
11e60 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74   when skipping t
11e70 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
11e80 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
11e90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11ea0 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69  drInit);.}.#endi
11eb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11ec0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
11ed0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11ee0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11ef0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  TABLE./*.** Allo
11f00 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  cate and populat
11f10 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  e an sqlite3_ind
11f20 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
11f30 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  e. It is the .**
11f40 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
11f50 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
11f60 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
11f70 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ase the structur
11f80 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20  e.** by passing 
11f90 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  the pointer retu
11fa0 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
11fb0 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33  ction to sqlite3
11fc0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
11fd0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ic sqlite3_index
11fe0 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49  _info *allocateI
11ff0 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73  ndexInfo(.  Pars
12000 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 68  e *pParse, .  Wh
12010 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
12020 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12030 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
12040 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12050 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  y.){.  int i, j;
12060 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
12070 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
12080 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
12090 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
120a0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
120b0 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
120c0 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
120d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
120e0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
120f0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
12100 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
12110 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
12120 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12130 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20  o *pIdxInfo;..  
12140 57 48 45 52 45 54 52 41 43 45 28 28 22 52 65 63  WHERETRACE(("Rec
12150 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69  omputing index i
12160 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22  nfo for %s...\n"
12170 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
12180 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ame));..  /* Cou
12190 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
121a0 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
121b0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
121c0 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a  ts referring.  *
121d0 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  * to this virtua
121e0 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  l table */.  for
121f0 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
12200 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
12210 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
12220 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
12230 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
12240 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
12250 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
12260 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
12270 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65  ->eOperator&(pTe
12280 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29  rm->eOperator-1)
12290 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )==0 );.    test
122a0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
122b0 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b  erator==WO_IN );
122c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
122d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
122e0 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
122f0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
12300 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
12310 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
12320 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
12330 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
12340 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
12350 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
12360 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
12370 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
12380 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
12390 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
123a0 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
123b0 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
123c0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
123d0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
123e0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
123f0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
12400 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
12410 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
12420 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12430 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
12440 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12450 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
12460 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
12470 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
12480 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
12490 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
124a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
124b0 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ==pOrderBy->nExp
124c0 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  r ){.      nOrde
124d0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
124e0 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  nExpr;.    }.  }
124f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12500 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
12510 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12520 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
12530 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12540 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
12550 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
12560 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
12590 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
125a0 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
125d0 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
125e0 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
125f0 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
12600 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12610 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
12620 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
12630 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20     /* (double)0 
12640 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
12650 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
12660 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
12670 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12680 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12690 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
126a0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
126b0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
126c0 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61  contains.  ** ma
126d0 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
126e0 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
126f0 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
12700 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
12710 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65   ** changing the
12720 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  m.  We have to d
12730 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73  o some funky cas
12740 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f  ting in order to
12750 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
12760 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
12770 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
12780 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
12790 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
127a0 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b  t*)&pIdxInfo[1];
127b0 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d  .  pIdxOrderBy =
127c0 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
127d0 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
127e0 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
127f0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74  ;.  pUsage = (st
12800 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
12810 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
12820 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
12830 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a  y[nOrderBy];.  *
12840 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
12850 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
12860 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26  Term;.  *(int*)&
12870 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
12880 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
12890 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
128a0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
128b0 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
128c0 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  aConstraint = pI
128d0 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75  dxCons;.  *(stru
128e0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
128f0 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
12900 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
12910 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
12920 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
12930 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
12940 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49  t_usage**)&pIdxI
12950 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12960 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67             pUsag
129b0 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  e;..  for(i=j=0,
129c0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
129d0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
129e0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
129f0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
12a00 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
12a10 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
12a20 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
12a30 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12a40 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
12a50 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
12a60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
12a70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
12a80 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
12a90 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
12aa0 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
12ab0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
12ac0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
12ad0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
12ae0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12af0 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
12b00 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
12b10 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
12b20 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
12b30 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
12b40 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
12b50 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
12b60 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68  rator;.    /* Th
12b70 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
12b80 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
12b90 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
12ba0 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
12bb0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
12bc0 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
12bd0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
12be0 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
12bf0 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
12c00 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
12c10 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
12c20 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
12c30 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
12c40 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
12c50 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
12c60 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
12c70 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12c80 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
12c90 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
12ca0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12cb0 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
12cc0 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
12cd0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12ce0 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
12cf0 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
12d00 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12d10 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
12d20 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
12d30 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
12d40 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
12d50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
12d60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12d70 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
12d80 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
12d90 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
12da0 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   j++;.  }.  for(
12db0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
12dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
12dd0 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
12de0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
12df0 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
12e00 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
12e10 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
12e20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64  pIdxOrderBy[i].d
12e30 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  esc = pOrderBy->
12e40 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
12e50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
12e60 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dxInfo;.}../*.**
12e70 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   The table objec
12e80 74 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73  t reference pass
12e90 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
12ea0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
12eb0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
12ec0 73 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76  st represent a v
12ed0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68  irtual table. Th
12ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
12ef0 6b 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64  kes the xBestInd
12f00 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ex().** method o
12f10 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
12f20 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c  ble with the sql
12f30 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12f40 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a  pointer passed.*
12f50 2a 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  * as the argumen
12f60 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
12f70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
12f80 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
12f90 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
12fa0 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
12fb0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
12fc0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12fd0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
12fe0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
12ff0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
13000 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
13010 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
13020 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
13030 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
13040 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
13050 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
13060 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
13070 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
13080 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
13090 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
130a0 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
130b0 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
130c0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
130d0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
130e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
130f0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
13100 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
13110 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
13120 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
13130 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
13140 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
13150 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
13160 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
13170 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
13180 74 20 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52  t rc;..  WHERETR
13190 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78  ACE(("xBestIndex
131a0 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62   for %s\n", pTab
131b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41  ->zName));.  TRA
131c0 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
131d0 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
131e0 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
131f0 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
13200 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
13210 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
13220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13230 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13240 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
13250 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13260 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
13270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56     }else if( !pV
13280 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
13290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
132a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
132b0 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
132c0 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  r(rc));.    }els
132d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
132e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
132f0 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45   "%s", pVtab->zE
13300 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
13310 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
13320 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
13330 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
13340 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  sg = 0;..  for(i
13350 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
13360 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
13370 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61  if( !p->aConstra
13380 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26  int[i].usable &&
13390 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
133a0 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
133b0 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
133c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
133d0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
133e0 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
133f0 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
13400 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
13410 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13420 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13430 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  rn pParse->nErr;
13440 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
13450 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
13460 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
13470 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
13480 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
13490 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
134a0 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
134b0 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
134c0 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
134d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
134e0 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
134f0 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
13500 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
13510 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13520 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
13530 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
13540 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
13550 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
13560 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
13570 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
13580 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
13590 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
135a0 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
135b0 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
135c0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
135d0 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
135e0 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
135f0 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
13600 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
13610 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
13620 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
13630 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
13640 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13650 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
13660 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
13670 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
13680 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
13690 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
136a0 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
136b0 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
136c0 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
136d0 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
136e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
136f0 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
13700 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
13710 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
13720 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
13730 64 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  d bestVirtualInd
13740 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
13750 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
13760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13770 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13780 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
13790 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  WC,             
137a0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
137b0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
137c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
137d0 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSrc,      /* Th
137e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
137f0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
13800 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
13810 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dy,             
13820 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
13830 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
13840 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  le for index */.
13850 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
13860 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
13870 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
13880 20 76 61 6c 69 64 20 66 6f 72 20 61 6e 79 20 70   valid for any p
13890 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72  urpose */.  Expr
138a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
138c0 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
138d0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  se */.  WhereCos
138e0 74 20 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20  t *pCost,       
138f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73          /* Lowes
13900 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61  t cost query pla
13910 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
13920 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64  ndex_info **ppId
13930 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20  xInfo  /* Index 
13940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
13950 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
13960 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
13970 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
13980 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
13990 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
139a0 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
139b0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
139c0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
139d0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
139e0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
139f0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
13a00 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
13a10 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
13a20 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
13a30 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b  .  double rCost;
13a40 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13a50 20 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74   wsFlags is init
13a60 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20  ialized to some 
13a70 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65  sane value. Othe
13a80 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20  rwise, if the . 
13a90 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c   ** malloc in al
13aa0 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
13ab0 29 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73  ) fails and this
13ac0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
13ad0 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77  s leaving.  ** w
13ae0 73 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69  sFlags in an uni
13af0 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
13b00 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
13b10 20 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63   behave unpredic
13b20 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65  tably..  */.  me
13b30 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
13b40 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
13b50 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
13b60 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
13b70 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
13b80 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
13b90 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13ba0 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
13bb0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
13bc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
13bd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
13be0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
13bf0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
13c00 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
13c10 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  fo = *ppIdxInfo;
13c20 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
13c30 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78  =0 ){.    *ppIdx
13c40 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20  Info = pIdxInfo 
13c50 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
13c60 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
13c70 20 70 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29   pSrc, pOrderBy)
13c80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
13c90 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Info==0 ){.    r
13ca0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
13cb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
13cc0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
13cd0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
13ce0 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70   that pIdxInfo p
13cf0 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69  oints.  ** to wi
13d00 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  ll have been ini
13d10 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72  tialized, either
13d20 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
13d30 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ent invocation o
13d40 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f  r.  ** during so
13d50 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74  me prior invocat
13d60 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73  ion.  Now we jus
13d70 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d  t have to custom
13d80 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74  ize the.  ** det
13d90 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f  ails of pIdxInfo
13da0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
13db0 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
13dc0 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20  pass it to.  ** 
13dd0 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f  xBestIndex..  */
13de0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c  ..  /* The modul
13df0 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64  e name must be d
13e00 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79  efined. Also, by
13e10 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
13e20 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  e must.  ** be a
13e30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
13e40 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
13e50 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
13e60 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65  .  ** sqlite3Vie
13e70 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
13e80 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63  ) would have pic
13e90 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72  ked up the error
13ea0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
13eb0 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  ( pTab->azModule
13ec0 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d  Arg && pTab->azM
13ed0 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20  oduleArg[0] );. 
13ee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13ef0 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
13f00 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a  ->db, pTab) );..
13f10 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
13f20 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
13f30 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
13f40 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
13f50 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
13f60 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
13f70 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
13f80 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
13f90 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
13fa0 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
13fb0 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
13fc0 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
13fd0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
13fe0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
13ff0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
14000 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
14010 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
14020 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
14030 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
14040 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
14050 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
14060 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
14070 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
14080 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
14090 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
140a0 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
140b0 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
140c0 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
140d0 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
140e0 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
140f0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
14100 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
14110 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
14120 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
14130 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
14140 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
14150 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
14160 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
14170 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
14180 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
14190 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
141a0 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
141b0 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
141c0 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
141d0 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
141e0 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
141f0 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
14200 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
14210 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
14220 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
14230 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
14240 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
14250 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
14260 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
14270 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
14280 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
14290 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
142a0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
142b0 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
142c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
142d0 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
142e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
142f0 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
14300 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
14310 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
14320 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
14330 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
14340 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
14350 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
14360 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
14370 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
14380 3e 70 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74  >prereqRight&not
14390 52 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a  Ready) ? 0 : 1;.
143a0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
143b0 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
143c0 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
143d0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
143e0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
143f0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
14400 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
14410 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
14420 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
14430 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
14440 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
14450 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
14460 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
14470 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
14480 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
14490 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
144a0 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32  .  /* ((double)2
144b0 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
144c0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
144d0 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
144e0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
144f0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
14500 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75  _BIG_DBL / ((dou
14510 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72  ble)2);.  nOrder
14520 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  By = pIdxInfo->n
14530 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
14540 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
14550 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
14560 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  By = 0;.  }..  i
14570 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  f( vtabBestIndex
14580 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
14590 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  IdxInfo) ){.    
145a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
145b0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
145c0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
145d0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
145e0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
145f0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
14600 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
14610 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
14620 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
14630 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
14640 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
14650 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64  ed |= pWC->a[pId
14660 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66  xCons[i].iTermOf
14670 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
14680 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
14690 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
146a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
146b0 65 2c 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63  e, and the selec
146c0 74 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ted virtual tabl
146d0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65  e index.  ** doe
146e0 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74  s not satisfy it
146f0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 63  , increase the c
14700 6f 73 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20  ost of the scan 
14710 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69  accordingly. Thi
14720 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74  s.  ** matches t
14730 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
14740 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61  r non-virtual ta
14750 62 6c 65 73 20 69 6e 20 62 65 73 74 42 74 72 65  bles in bestBtre
14760 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20  eIndex()..  */. 
14770 20 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66   rCost = pIdxInf
14780 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
14790 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
147a0 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72   && pIdxInfo->or
147b0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30  derByConsumed==0
147c0 20 29 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d   ){.    rCost +=
147d0 20 65 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72   estLog(rCost)*r
147e0 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Cost;.  }..  /* 
147f0 54 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20  The cost is not 
14800 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61  allowed to be la
14810 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
14820 5f 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20  _BIG_DBL (the.  
14830 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20  ** inital value 
14840 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e  of lowestCost in
14850 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69   this loop. If i
14860 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
14870 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74   ** (cost<lowest
14880 43 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77  Cost) test below
14890 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74   will never be t
148a0 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  rue..  ** .  ** 
148b0 55 73 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20  Use "(double)2" 
148c0 69 6e 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22  instead of "2.0"
148d0 20 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c   in case OMIT_FL
148e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20  OATING_POINT .  
148f0 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20  ** is defined.. 
14900 20 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54   */.  if( (SQLIT
14910 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62  E_BIG_DBL/((doub
14920 6c 65 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a  le)2))<rCost ){.
14930 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
14940 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
14950 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b  BL/((double)2));
14960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
14970 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f  ost->rCost = rCo
14980 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d  st;.  }.  pCost-
14990 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
149a0 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69   = pIdxInfo;.  i
149b0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  f( pIdxInfo->ord
149c0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a  erByConsumed ){.
149d0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
149e0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
149f0 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20  _ORDERBY;.  }.  
14a00 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20  pCost->plan.nEq 
14a10 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
14a20 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
14a30 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
14a40 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65  to find a more e
14a50 66 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20  fficient access 
14a60 70 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67  pattern by using
14a70 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65   multiple indexe
14a80 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69  s.  ** to optimi
14a90 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73  ze an OR express
14aa0 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57  ion within the W
14ab0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20  HERE clause. .  
14ac0 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73  */.  bestOrClaus
14ad0 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
14ae0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
14af0 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f  dy, notValid, pO
14b00 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a  rderBy, pCost);.
14b10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14b20 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14b30 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
14b40 72 67 75 6d 65 6e 74 20 70 49 64 78 20 69 73 20  rgument pIdx is 
14b50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
14b60 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
14b70 74 68 61 74 20 68 61 73 20 61 6e 20 61 72 72 61  that has an arra
14b80 79 20 6f 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  y of.** SQLITE_I
14b90 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 65 76 65  NDEX_SAMPLES eve
14ba0 6e 6c 79 20 73 70 61 63 65 64 20 73 61 6d 70 6c  nly spaced sampl
14bb0 65 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  es of the first 
14bc0 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 0a 2a  indexed column.*
14bd0 2a 20 73 74 6f 72 65 64 20 69 6e 20 49 6e 64 65  * stored in Inde
14be0 78 2e 61 53 61 6d 70 6c 65 2e 20 54 68 65 73 65  x.aSample. These
14bf0 20 73 61 6d 70 6c 65 73 20 64 69 76 69 64 65 20   samples divide 
14c00 74 68 65 20 64 6f 6d 61 69 6e 20 6f 66 20 76 61  the domain of va
14c10 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 74  lues stored.** t
14c20 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 28 53  he index into (S
14c30 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
14c40 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e 73 2e 0a  LES+1) regions..
14c50 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63 6f 6e 74  ** Region 0 cont
14c60 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  ains all values 
14c70 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 66 69  less than the fi
14c80 72 73 74 20 73 61 6d 70 6c 65 20 76 61 6c 75 65  rst sample value
14c90 2e 20 52 65 67 69 6f 6e 0a 2a 2a 20 31 20 63 6f  . Region.** 1 co
14ca0 6e 74 61 69 6e 73 20 76 61 6c 75 65 73 20 62 65  ntains values be
14cb0 74 77 65 65 6e 20 74 68 65 20 66 69 72 73 74 20  tween the first 
14cc0 61 6e 64 20 73 65 63 6f 6e 64 20 73 61 6d 70 6c  and second sampl
14cd0 65 73 2e 20 20 52 65 67 69 6f 6e 20 32 20 63 6f  es.  Region 2 co
14ce0 6e 74 61 69 6e 73 0a 2a 2a 20 76 61 6c 75 65 73  ntains.** values
14cf0 20 62 65 74 77 65 65 6e 20 73 61 6d 70 6c 65 73   between samples
14d00 20 32 20 61 6e 64 20 33 2e 20 20 41 6e 64 20 73   2 and 3.  And s
14d10 6f 20 6f 6e 2e 20 20 52 65 67 69 6f 6e 20 53 51  o on.  Region SQ
14d20 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
14d30 45 53 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 76  ES.** contains v
14d40 61 6c 75 65 73 20 6c 61 72 67 65 72 20 74 68 61  alues larger tha
14d50 6e 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70 6c  n the last sampl
14d60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
14d70 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 6d  index contains m
14d80 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 20 6f  any duplicates o
14d90 66 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  f a single value
14da0 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
14db0 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 77  possible that tw
14dc0 6f 20 6f 72 20 6d 6f 72 65 20 61 64 6a 61 63 65  o or more adjace
14dd0 6e 74 20 73 61 6d 70 6c 65 73 20 63 61 6e 20 68  nt samples can h
14de0 6f 6c 64 20 74 68 65 20 73 61 6d 65 20 76 61 6c  old the same val
14df0 75 65 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 61 74  ue..** When that
14e00 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
14e10 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
14e20 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f 64 65 20  ble region code 
14e30 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77  is returned.** w
14e40 68 65 6e 20 72 6f 75 6e 64 55 70 20 69 73 20 66  hen roundUp is f
14e50 61 6c 73 65 20 61 6e 64 20 74 68 65 20 6c 61 72  alse and the lar
14e60 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 72 65  gest possible re
14e70 67 69 6f 6e 20 63 6f 64 65 20 69 73 20 72 65 74  gion code is ret
14e80 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e 20 72 6f  urned.** when ro
14e90 75 6e 64 55 70 20 69 73 20 74 72 75 65 2e 0a 2a  undUp is true..*
14ea0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
14eb0 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
14ec0 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  n determines whi
14ed0 63 68 20 6f 66 20 74 68 65 20 72 65 67 69 6f 6e  ch of the region
14ee0 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70 56 61 6c  s value .** pVal
14ef0 20 6c 69 65 73 20 69 6e 2c 20 73 65 74 73 20 2a   lies in, sets *
14f00 70 69 52 65 67 69 6f 6e 20 74 6f 20 74 68 65 20  piRegion to the 
14f10 72 65 67 69 6f 6e 20 69 6e 64 65 78 20 28 61 20  region index (a 
14f20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 0a  value between 0.
14f30 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  ** and SQLITE_IN
14f40 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 2c 20 69  DEX_SAMPLES+1, i
14f50 6e 63 6c 75 73 69 76 65 29 20 61 6e 64 20 72 65  nclusive) and re
14f60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
14f70 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  .** Or, if an OO
14f80 4d 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 63  M occurs while c
14f90 6f 6e 76 65 72 74 69 6e 67 20 74 65 78 74 20 76  onverting text v
14fa0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 65 6e  alues between en
14fb0 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20 53 51 4c 49  codings,.** SQLI
14fc0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
14fd0 72 6e 65 64 20 61 6e 64 20 2a 70 69 52 65 67 69  rned and *piRegi
14fe0 6f 6e 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  on is undefined.
14ff0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15000 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 73  E_ENABLE_STAT2.s
15010 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
15020 61 6e 67 65 52 65 67 69 6f 6e 28 0a 20 20 50 61  angeRegion(.  Pa
15030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
15050 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15060 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
15070 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
15080 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
15090 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
150a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
150b0 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20 20  lue *pVal,      
150c0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f    /* Value to co
150d0 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  nsider */.  int 
150e0 72 6f 75 6e 64 55 70 2c 20 20 20 20 20 20 20 20  roundUp,        
150f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15100 6e 20 6c 61 72 67 65 73 74 20 76 61 6c 69 64 20  n largest valid 
15110 72 65 67 69 6f 6e 20 69 66 20 74 72 75 65 20 2a  region if true *
15120 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65 67 69 6f  /.  int *piRegio
15130 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
15140 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f  /* OUT: Region o
15150 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63  f domain in whic
15160 68 20 76 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a  h value lies */.
15170 29 7b 0a 20 20 61 73 73 65 72 74 28 20 72 6f 75  ){.  assert( rou
15180 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64  ndUp==0 || round
15190 55 70 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 41  Up==1 );.  if( A
151a0 4c 57 41 59 53 28 70 56 61 6c 29 20 29 7b 0a 20  LWAYS(pVal) ){. 
151b0 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a     IndexSample *
151c0 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
151d0 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20 69 6e 74  aSample;.    int
151e0 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
151f0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
15200 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29  value_type(pVal)
15210 3b 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  ;..    if( eType
15220 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
15230 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
15240 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
15250 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
15260 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
15270 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f  (pVal);.      fo
15280 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f  r(i=0; i<SQLITE_
15290 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69  INDEX_SAMPLES; i
152a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
152b0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
152c0 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
152d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
152e0 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
152f0 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f  ].eType>=SQLITE_
15300 54 45 58 54 20 29 20 62 72 65 61 6b 3b 0a 20 20  TEXT ) break;.  
15310 20 20 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55        if( roundU
15320 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
15330 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
15340 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  r>r ) break;.   
15350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15360 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
15370 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29 20 62 72  e[i].u.r>=r ) br
15380 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15390 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
153a0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
153b0 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  TE_NULL ){.     
153c0 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66   i = 0;.      if
153d0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
153e0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 53 51       while( i<SQ
153f0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
15400 45 53 20 26 26 20 61 53 61 6d 70 6c 65 5b 69 5d  ES && aSample[i]
15410 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
15420 55 4c 4c 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  ULL ) i++;.     
15430 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20   }.    }else{ . 
15440 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
15450 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15460 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
15470 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  oll;.      const
15480 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e   u8 *z;.      in
15490 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70  t n;..      /* p
154a0 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  Val comes from s
154b0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
154c0 78 70 72 28 29 20 73 6f 20 74 68 65 20 74 79 70  xpr() so the typ
154d0 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
154e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
154f0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
15500 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53  TEXT || eType==S
15510 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a 20  QLITE_BLOB );.. 
15520 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
15530 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
15540 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
15550 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76  t u8 *)sqlite3_v
15560 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b  alue_blob(pVal);
15570 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
15580 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
15590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
155a0 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pColl->enc==SQLI
155b0 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
155c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
155d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
155e0 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  etCollSeq(db, SQ
155f0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70  LITE_UTF8, 0, *p
15600 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
15610 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
15620 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15630 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15640 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
15650 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
15660 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  nce: %s",.      
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c      *pIdx->azCol
15690 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  l);.          re
156a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
156b0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
156c0 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
156d0 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75  u8 *)sqlite3Valu
156e0 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c  eText(pVal, pCol
156f0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20  l->enc);.       
15700 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20   if( !z ){.     
15710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15730 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
15740 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26  rt( z && pColl &
15750 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  & pColl->xCmp );
15760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
15770 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42   = sqlite3ValueB
15780 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  ytes(pVal, pColl
15790 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20 20 20 66  ->enc);..      f
157a0 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45  or(i=0; i<SQLITE
157b0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20  _INDEX_SAMPLES; 
157c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
157d0 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
157e0 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20 61   eSampletype = a
157f0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b  Sample[i].eType;
15800 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
15810 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c 49 54 45  mpletype==SQLITE
15820 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c 65  _NULL || eSample
15830 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f 6e  type<eType ) con
15840 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
15850 66 28 20 28 65 53 61 6d 70 6c 65 74 79 70 65 21  f( (eSampletype!
15860 3d 65 54 79 70 65 29 20 29 20 62 72 65 61 6b 3b  =eType) ) break;
15870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15880 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
15890 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e     if( pColl->en
158a0 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c!=SQLITE_UTF8 )
158b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
158c0 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20  nSample;.       
158d0 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c 65     char *zSample
158e0 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74 6f   = sqlite3Utf8to
158f0 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  16(.            
15900 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63    db, pColl->enc
15910 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a  , aSample[i].u.z
15920 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79  , aSample[i].nBy
15930 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20 20  te, &nSample.   
15940 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15950 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c 65      if( !zSample
15960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15970 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
15980 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
15990 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
159a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
159b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
159c0 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
159d0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
159e0 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c   nSample, zSampl
159f0 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e, n, z);.      
15a00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15a10 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a  e(db, zSample);.
15a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
15a30 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
15a40 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
15a50 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
15a60 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b 69  pUser, aSample[i
15a70 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c 65  ].nByte, aSample
15a80 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a  [i].u.z, n, z);.
15a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15aa0 20 20 69 66 28 20 63 2d 72 6f 75 6e 64 55 70 3e    if( c-roundUp>
15ab0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15ac0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
15ad0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
15ae0 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  <=SQLITE_INDEX_S
15af0 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 2a 70  AMPLES );.    *p
15b00 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a 20 20 7d  iRegion = i;.  }
15b10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15b20 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  _OK;.}.#endif   
15b30 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
15b40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f  _ENABLE_STAT2 */
15b50 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
15b60 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70 72  ssion pExpr repr
15b70 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61 6c  esents a literal
15b80 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70 20   value, set *pp 
15b90 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61  to point to.** a
15ba0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
15bb0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
15bc0 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61  ning the same va
15bd0 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e 69  lue, with affini
15be0 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69 65  ty.** aff applie
15bf0 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65 20  d to it, before 
15c00 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69 73  returning. It is
15c10 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
15c20 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ity of the .** c
15c30 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15c40 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69 73  lly release this
15c50 20 73 74 72 75 63 74 75 72 65 20 62 79 20 70 61   structure by pa
15c60 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20  ssing it to .** 
15c70 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
15c80 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
15c90 20 63 75 72 72 65 6e 74 20 70 61 72 73 65 20 69   current parse i
15ca0 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28 73  s a recompile (s
15cb0 71 6c 69 74 65 33 52 65 70 72 65 70 61 72 65 28  qlite3Reprepare(
15cc0 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20  )) and pExpr.** 
15cd0 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62  is an SQL variab
15ce0 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  le that currentl
15cf0 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  y has a non-NULL
15d00 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20   value bound to 
15d10 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e  it,.** create an
15d20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
15d30 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
15d40 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c 20  ing this value, 
15d50 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66  again with.** af
15d60 66 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c 69  finity aff appli
15d70 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65 61  ed to it, instea
15d80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  d..**.** If neit
15d90 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76 65  her of the above
15da0 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70 20   apply, set *pp 
15db0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  to NULL..**.** I
15dc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15dd0 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
15de0 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
15df0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
15e00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15e10 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 73 74 61  ENABLE_STAT2.sta
15e20 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f  tic int valueFro
15e30 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  mExpr(.  Parse *
15e40 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
15e50 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61 66  *pExpr, .  u8 af
15e60 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  f, .  sqlite3_va
15e70 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66  lue **pp.){.  if
15e80 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15e90 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28  VARIABLE.   || (
15ea0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
15eb0 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
15ec0 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  >op2==TK_VARIABL
15ed0 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  E).  ){.    int 
15ee0 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43  iVar = pExpr->iC
15ef0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
15f00 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
15f10 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
15f20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  iVar); /* IMP: R
15f30 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a  -23257-02778 */.
15f40 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
15f50 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70 50  3VdbeGetValue(pP
15f60 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
15f70 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20 20  , iVar, aff);.  
15f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15f90 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
15fa0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
15fb0 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  mExpr(pParse->db
15fc0 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45 5f  , pExpr, SQLITE_
15fd0 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b 0a  UTF8, aff, pp);.
15fe0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15ff0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16000 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74   used to estimat
16010 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
16020 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16030 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20  e visited.** by 
16040 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65  scanning an inde
16050 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66  x for a range of
16060 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e   values. The ran
16070 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75  ge may have an u
16080 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61  pper.** bound, a
16090 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72   lower bound, or
160a0 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45   both. The WHERE
160b0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
160c0 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72  at set the upper
160d0 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  .** and lower bo
160e0 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65  unds are represe
160f0 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61  nted by pLower a
16100 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63  nd pUpper respec
16110 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65  tively. For.** e
16120 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67  xample, assuming
16130 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73   that index p is
16140 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a   on t1(a):.**.**
16150 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
16160 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
16170 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20   < ? ....**     
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16190 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c  _____|   |_____|
161a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
161b0 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
161c0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
161e0 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a  wer    pUpper.**
161f0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
16200 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f   the upper or lo
16210 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74  wer bound is not
16220 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e   present, then N
16230 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e  ULL is passed in
16240 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65  .** place of the
16250 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
16260 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
16270 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74 65  The nEq paramete
16280 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
16290 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e 64  index of the ind
162a0 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ex column subjec
162b0 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e 67  t to the.** rang
162c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
162d0 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
162e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  the number of eq
162f0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
16300 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 20  ts.** optimized 
16310 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
16320 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
16330 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
16340 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a 20  g index p is.** 
16350 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
16360 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
16370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
16380 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
16390 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
163a0 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
163b0 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
163c0 20 62 65 20 70 61 73 73 65 64 20 74 68 65 20 76   be passed the v
163d0 61 6c 75 65 20 31 20 28 61 73 20 74 68 65 20 72  alue 1 (as the r
163e0 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20  ange restricted 
163f0 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73  column,.** b, is
16400 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
16410 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
16420 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
16430 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
16440 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16450 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
16460 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
16470 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
16480 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 30  ould be passed 0
16490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
164a0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61 6e  rned value is an
164b0 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
164c0 20 31 20 61 6e 64 20 31 30 30 2c 20 69 6e 63 6c   1 and 100, incl
164d0 75 73 69 76 65 2e 20 41 20 72 65 74 75 72 6e 0a  usive. A return.
164e0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31 20 69 6e  ** value of 1 in
164f0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
16500 20 70 72 6f 70 6f 73 65 64 20 72 61 6e 67 65 20   proposed range 
16510 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
16520 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20 61 70 70   to visit.** app
16530 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f 31 30 30  roximately 1/100
16540 74 68 20 28 31 25 29 20 6f 66 20 74 68 65 20 72  th (1%) of the r
16550 6f 77 73 20 73 65 6c 65 63 74 65 64 20 62 79 20  ows selected by 
16560 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
16570 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
16580 28 69 66 20 61 6e 79 29 2e 20 41 20 72 65 74 75  (if any). A retu
16590 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20  rn value of 100 
165a0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69  indicates that i
165b0 74 20 69 73 20 65 78 70 65 63 74 65 64 0a 2a 2a  t is expected.**
165c0 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65 20   that the range 
165d0 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20  scan will visit 
165e0 65 76 65 72 79 20 72 6f 77 20 28 31 30 30 25 29  every row (100%)
165f0 20 73 65 6c 65 63 74 65 64 20 62 79 20 74 68 65   selected by the
16600 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
16610 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  straints..**.** 
16620 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
16630 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41  f sqlite_stat2 A
16640 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65 61 63  NALYZE data, eac
16650 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69  h range inequali
16660 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68  ty.** reduces th
16670 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
16680 79 20 33 2f 34 74 68 73 2e 20 20 48 65 6e 63 65  y 3/4ths.  Hence
16690 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   a single constr
166a0 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72 65  aint (x>?).** re
166b0 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75 72  sults in a retur
166c0 6e 20 6f 66 20 32 35 20 61 6e 64 20 61 20 72 61  n of 25 and a ra
166d0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  nge constraint (
166e0 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 73  x>? AND x<?) res
166f0 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65 74  ults.** in a ret
16700 75 72 6e 20 6f 66 20 36 2e 0a 2a 2f 0a 73 74 61  urn of 6..*/.sta
16710 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
16720 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  geScanEst(.  Par
16730 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16740 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
16750 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
16760 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
16770 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16780 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63 6f   /* The index co
16790 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 61 6e  ntaining the ran
167a0 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75  ge-compared colu
167b0 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74  mn; "x" */.  int
167c0 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   nEq,           
167d0 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    /* index into 
167e0 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65  p->aCol[] of the
167f0 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
16800 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
16810 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20  eTerm *pLower,  
16820 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20   /* Lower bound 
16830 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78  on the range. ex
16840 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20  : "x>123" Might 
16850 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65  be NULL */.  Whe
16860 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20  reTerm *pUpper, 
16870 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64    /* Upper bound
16880 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
16890 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74  x: "x<455" Might
168a0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
168b0 74 20 2a 70 69 45 73 74 20 20 20 20 20 20 20 20  t *piEst        
168c0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
168d0 6e 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  n value */.){.  
168e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
168f0 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
16900 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
16910 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
16920 20 70 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20   p->aSample ){. 
16930 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
16940 20 2a 70 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b   *pLowerVal = 0;
16950 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
16960 75 65 20 2a 70 55 70 70 65 72 56 61 6c 20 3d 20  ue *pUpperVal = 
16970 30 3b 0a 20 20 20 20 69 6e 74 20 69 45 73 74 3b  0;.    int iEst;
16980 0a 20 20 20 20 69 6e 74 20 69 4c 6f 77 65 72 20  .    int iLower 
16990 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 55 70  = 0;.    int iUp
169a0 70 65 72 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44  per = SQLITE_IND
169b0 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20  EX_SAMPLES;.    
169c0 69 6e 74 20 72 6f 75 6e 64 55 70 55 70 70 65 72  int roundUpUpper
169d0 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55  ;.    int roundU
169e0 70 4c 6f 77 65 72 3b 0a 20 20 20 20 75 38 20 61  pLower;.    u8 a
169f0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
16a00 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
16a10 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a  [0]].affinity;..
16a20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
16a30 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
16a40 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
16a50 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
16a60 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
16a70 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
16a80 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65  xpr, aff, &pLowe
16a90 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  rVal);.      ass
16aa0 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  ert( pLower->eOp
16ab0 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c  erator==WO_GT ||
16ac0 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
16ad0 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20  or==WO_GE );.   
16ae0 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 20     roundUpLower 
16af0 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  = (pLower->eOper
16b00 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20 3f 31 3a  ator==WO_GT) ?1:
16b10 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
16b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16b30 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
16b40 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
16b50 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
16b60 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
16b70 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
16b80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
16b90 66 66 2c 20 26 70 55 70 70 65 72 56 61 6c 29 3b  ff, &pUpperVal);
16ba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16bb0 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
16bc0 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65  ==WO_LT || pUppe
16bd0 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
16be0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 72 6f 75  _LE );.      rou
16bf0 6e 64 55 70 55 70 70 65 72 20 3d 20 28 70 55 70  ndUpUpper = (pUp
16c00 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
16c10 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a 20 20 20  WO_LE) ?1:0;.   
16c20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
16c30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c  SQLITE_OK || (pL
16c40 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20 70 55  owerVal==0 && pU
16c50 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20  pperVal==0) ){. 
16c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
16c70 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c 29  eFree(pLowerVal)
16c80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16c90 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72 56  alueFree(pUpperV
16ca0 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  al);.      goto 
16cb0 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61  range_est_fallba
16cc0 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ck;.    }else if
16cd0 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29  ( pLowerVal==0 )
16ce0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
16cf0 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
16d00 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72 56  arse, p, pUpperV
16d10 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70 70 65 72  al, roundUpUpper
16d20 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20  , &iUpper);.    
16d30 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 20 69    if( pLower ) i
16d40 4c 6f 77 65 72 20 3d 20 69 55 70 70 65 72 2f 32  Lower = iUpper/2
16d50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16d60 70 55 70 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a  pUpperVal==0 ){.
16d70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
16d80 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
16d90 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c  se, p, pLowerVal
16da0 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20  , roundUpLower, 
16db0 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20  &iLower);.      
16dc0 69 66 28 20 70 55 70 70 65 72 20 29 20 69 55 70  if( pUpper ) iUp
16dd0 70 65 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20  per = (iLower + 
16de0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
16df0 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20  PLES + 1)/2;.   
16e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
16e10 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67   = whereRangeReg
16e20 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ion(pParse, p, p
16e30 55 70 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55  UpperVal, roundU
16e40 70 55 70 70 65 72 2c 20 26 69 55 70 70 65 72 29  pUpper, &iUpper)
16e50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16e70 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
16e80 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
16e90 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c  e, p, pLowerVal,
16ea0 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26   roundUpLower, &
16eb0 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
16ec0 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
16ed0 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73 63  TRACE(("range sc
16ee0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e  an regions: %d..
16ef0 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69  %d\n", iLower, i
16f00 55 70 70 65 72 29 29 3b 0a 0a 20 20 20 20 69 45  Upper));..    iE
16f10 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  st = iUpper - iL
16f20 6f 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63 61  ower;.    testca
16f30 73 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54 45  se( iEst==SQLITE
16f40 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
16f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 45  ;.    assert( iE
16f60 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  st<=SQLITE_INDEX
16f70 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20  _SAMPLES );.    
16f80 69 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20 20  if( iEst<1 ){.  
16f90 20 20 20 20 2a 70 69 45 73 74 20 3d 20 35 30 2f      *piEst = 50/
16fa0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
16fb0 50 4c 45 53 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  PLES;.    }else{
16fc0 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20  .      *piEst = 
16fd0 28 69 45 73 74 2a 31 30 30 29 2f 53 51 4c 49 54  (iEst*100)/SQLIT
16fe0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
16ff0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17000 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77  e3ValueFree(pLow
17010 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  erVal);.    sqli
17020 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70  te3ValueFree(pUp
17030 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 72 65 74  perVal);.    ret
17040 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67  urn rc;.  }.rang
17050 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a  e_est_fallback:.
17060 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
17070 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
17080 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
17090 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
170a0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
170b0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
170c0 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
170d0 70 65 72 20 29 3b 0a 20 20 2a 70 69 45 73 74 20  per );.  *piEst 
170e0 3d 20 31 30 30 3b 0a 20 20 69 66 28 20 70 4c 6f  = 100;.  if( pLo
170f0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
17100 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
17110 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 69 45 73  NULL)==0 ) *piEs
17120 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28 20 70 55  t /= 4;.  if( pU
17130 70 70 65 72 20 29 20 2a 70 69 45 73 74 20 2f 3d  pper ) *piEst /=
17140 20 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   4;.  return rc;
17150 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
17160 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f  E_ENABLE_STAT2./
17170 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
17180 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
17190 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
171a0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
171b0 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
171c0 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
171d0 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
171e0 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
171f0 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
17200 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
17210 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
17220 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
17230 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
17240 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
17250 65 5f 73 74 61 74 32 20 68 69 73 74 6f 67 72 61  e_stat2 histogra
17260 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
17270 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
17280 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  index..**.** Wri
17290 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
172a0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
172b0 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
172c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
172d0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
172e0 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
172f0 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
17300 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
17310 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17320 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17330 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17340 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
17350 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
17360 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
17370 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
17380 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
17390 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
173a0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
173b0 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
173c0 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
173d0 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
173e0 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
173f0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
17400 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
17410 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
17420 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
17430 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
17440 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
17450 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
17460 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
17470 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17480 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
17490 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
174a0 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
174b0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
174c0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
174d0 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
174e0 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
174f0 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c  raint */.  doubl
17500 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
17510 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
17520 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
17530 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
17540 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
17550 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55  hs = 0;  /* VALU
17560 45 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  E on right-hand 
17570 73 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f  side of pTerm */
17580 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72 2c 20 69  .  int iLower, i
17590 55 70 70 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  Upper;       /* 
175a0 52 61 6e 67 65 20 6f 66 20 68 69 73 74 6f 67 72  Range of histogr
175b0 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f 6e 74 61  am regions conta
175c0 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f 0a 20 20  ining pRhs */.  
175d0 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
175e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
175f0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
17600 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17620 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
17630 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62  n code */.  doub
17640 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  le nRowEst;     
17650 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74        /* New est
17660 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
17670 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 0a  ber of rows */..
17680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
17690 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 66 66  mple!=0 );.  aff
176a0 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
176b0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
176c0 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  ]].affinity;.  i
176d0 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
176e0 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
176f0 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
17700 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20  , aff, &pRhs);. 
17710 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
17720 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17730 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c  st_cancel;.  }el
17740 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d 20 73  se{.    pRhs = s
17750 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 70  qlite3ValueNew(p
17760 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
17770 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20 29 20    if( pRhs==0 ) 
17780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17790 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77  TFOUND;.  rc = w
177a0 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
177b0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c  pParse, p, pRhs,
177c0 20 30 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20   0, &iLower);.  
177d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
177e0 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
177f0 63 61 6e 63 65 6c 3b 0a 20 20 72 63 20 3d 20 77  cancel;.  rc = w
17800 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
17810 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c  pParse, p, pRhs,
17820 20 31 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20   1, &iUpper);.  
17830 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
17840 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f  ereEqualScanEst_
17850 63 61 6e 63 65 6c 3b 0a 20 20 57 48 45 52 45 54  cancel;.  WHERET
17860 52 41 43 45 28 28 22 65 71 75 61 6c 69 74 79 20  RACE(("equality 
17870 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64  scan regions: %d
17880 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c  ..%d\n", iLower,
17890 20 69 55 70 70 65 72 29 29 3b 0a 20 20 69 66 28   iUpper));.  if(
178a0 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20   iLower>=iUpper 
178b0 29 7b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d  ){.    nRowEst =
178c0 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f   p->aiRowEst[0]/
178d0 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  (SQLITE_INDEX_SA
178e0 4d 50 4c 45 53 2a 32 29 3b 0a 20 20 20 20 69 66  MPLES*2);.    if
178f0 28 20 6e 52 6f 77 45 73 74 3c 2a 70 6e 52 6f 77  ( nRowEst<*pnRow
17900 20 29 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77   ) *pnRow = nRow
17910 45 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Est;.  }else{.  
17920 20 20 6e 52 6f 77 45 73 74 20 3d 20 28 69 55 70    nRowEst = (iUp
17930 70 65 72 2d 69 4c 6f 77 65 72 29 2a 70 2d 3e 61  per-iLower)*p->a
17940 69 52 6f 77 45 73 74 5b 30 5d 2f 53 51 4c 49 54  iRowEst[0]/SQLIT
17950 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
17960 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
17970 6f 77 45 73 74 3b 0a 20 20 7d 0a 0a 77 68 65 72  owEst;.  }..wher
17980 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
17990 6e 63 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  ncel:.  sqlite3V
179a0 61 6c 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a  alueFree(pRhs);.
179b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
179c0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
179d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
179e0 54 41 54 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TAT2) */..#ifdef
179f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17a00 54 41 54 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT2./*.** Estim
17a10 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17a20 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17a30 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
17a40 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
17a50 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
17a60 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
17a70 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
17a80 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
17a90 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
17aa0 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
17ab0 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
17ac0 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
17ad0 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
17ae0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
17af0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
17b00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
17b10 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
17b20 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
17b30 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
17b40 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
17b50 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
17b60 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
17b70 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
17b80 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
17b90 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
17ba0 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
17bb0 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
17bc0 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
17bd0 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
17be0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
17bf0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
17c00 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
17c10 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
17c20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
17c30 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
17c40 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17c50 0a 2a 2f 0a 69 6e 74 20 77 68 65 72 65 49 6e 53  .*/.int whereInS
17c60 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
17c70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
17c80 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
17c90 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17ca0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
17cb0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17cc0 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
17cd0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17ce0 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20  n is pTerm */.  
17cf0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
17d00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
17d10 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48  e list on the RH
17d20 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76  S of "x IN (v1,v
17d30 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20  2,v3,...)" */.  
17d40 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20  double *pnRow   
17d50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
17d60 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
17d70 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
17d80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  {.  sqlite3_valu
17d90 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 2f 2a  e *pVal = 0;  /*
17da0 20 4f 6e 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   One value from 
17db0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  list */.  int iL
17dc0 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20 20 20  ower, iUpper;   
17dd0 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20      /* Range of 
17de0 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e  histogram region
17df0 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 52 68  s containing pRh
17e00 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20  s */.  u8 aff;  
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e   /* Column affin
17e30 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ity */.  int rc 
17e40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
17e50 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
17e60 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
17e70 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73  .  double nRowEs
17e80 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
17e90 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
17ea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17eb0 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  ws */.  int nSpa
17ec0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
17ed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68    /* Number of h
17ee0 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
17ef0 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   spanned */.  in
17f00 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 20 20  t nSingle = 0;  
17f10 20 20 20 20 20 20 20 20 2f 2a 20 48 69 73 74 6f          /* Histo
17f20 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 68 69 74  gram regions hit
17f30 20 62 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c   by a single val
17f40 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 74  ue */.  int nNot
17f50 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Found = 0;      
17f60 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 76 61    /* Count of va
17f70 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  lues that are no
17f80 74 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  t constants */. 
17f90 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17fc0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 61 53  unter */.  u8 aS
17fd0 70 61 6e 5b 53 51 4c 49 54 45 5f 49 4e 44 45 58  pan[SQLITE_INDEX
17fe0 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 20 20  _SAMPLES+1];    
17ff0 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67  /* Histogram reg
18000 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
18010 61 6e 6e 65 64 20 2a 2f 0a 20 20 75 38 20 61 53  anned */.  u8 aS
18020 69 6e 67 6c 65 5b 53 51 4c 49 54 45 5f 49 4e 44  ingle[SQLITE_IND
18030 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20  EX_SAMPLES+1];  
18040 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67  /* Histogram reg
18050 69 6f 6e 73 20 68 69 74 20 6f 6e 63 65 20 2a 2f  ions hit once */
18060 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
18070 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61  Sample!=0 );.  a
18080 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
18090 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
180a0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  [0]].affinity;. 
180b0 20 6d 65 6d 73 65 74 28 61 53 70 61 6e 2c 20 30   memset(aSpan, 0
180c0 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 6e 29 29  , sizeof(aSpan))
180d0 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 69 6e 67  ;.  memset(aSing
180e0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  le, 0, sizeof(aS
180f0 69 6e 67 6c 65 29 29 3b 0a 20 20 66 6f 72 28 69  ingle));.  for(i
18100 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18110 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
18120 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
18130 56 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 76  Val);.    rc = v
18140 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
18150 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
18160 2e 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 56  .pExpr, aff, &pV
18170 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  al);.    if( rc 
18180 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
18190 20 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69   pVal==0 || sqli
181a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
181b0 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Val)==SQLITE_NUL
181c0 4c 20 29 7b 0a 20 20 20 20 20 20 6e 4e 6f 74 46  L ){.      nNotF
181d0 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ound++;.      co
181e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
181f0 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
18200 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
18210 70 2c 20 70 56 61 6c 2c 20 30 2c 20 26 69 4c 6f  p, pVal, 0, &iLo
18220 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  wer);.    if( rc
18230 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
18240 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67   = whereRangeReg
18250 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ion(pParse, p, p
18260 56 61 6c 2c 20 31 2c 20 26 69 55 70 70 65 72 29  Val, 1, &iUpper)
18270 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
18280 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 69 4c  reak;.    if( iL
18290 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a  ower>=iUpper ){.
182a0 20 20 20 20 20 20 61 53 69 6e 67 6c 65 5b 69 4c        aSingle[iL
182b0 6f 77 65 72 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  ower] = 1;.    }
182c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
182d0 72 74 28 20 69 4c 6f 77 65 72 3e 3d 30 20 26 26  rt( iLower>=0 &&
182e0 20 69 55 70 70 65 72 3c 3d 53 51 4c 49 54 45 5f   iUpper<=SQLITE_
182f0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b  INDEX_SAMPLES );
18300 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4c  .      while( iL
18310 6f 77 65 72 3c 69 55 70 70 65 72 20 29 20 61 53  ower<iUpper ) aS
18320 70 61 6e 5b 69 4c 6f 77 65 72 2b 2b 5d 20 3d 20  pan[iLower++] = 
18330 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
18340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18350 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 53   ){.    for(i=nS
18360 70 61 6e 3d 30 3b 20 69 3c 3d 53 51 4c 49 54 45  pan=0; i<=SQLITE
18370 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20  _INDEX_SAMPLES; 
18380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
18390 61 53 70 61 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  aSpan[i] ){.    
183a0 20 20 20 20 6e 53 70 61 6e 2b 2b 3b 0a 20 20 20      nSpan++;.   
183b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 69     }else if( aSi
183c0 6e 67 6c 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20  ngle[i] ){.     
183d0 20 20 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20     nSingle++;.  
183e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
183f0 6e 52 6f 77 45 73 74 20 3d 20 28 6e 53 70 61 6e  nRowEst = (nSpan
18400 2a 32 2b 6e 53 69 6e 67 6c 65 29 2a 70 2d 3e 61  *2+nSingle)*p->a
18410 69 52 6f 77 45 73 74 5b 30 5d 2f 28 32 2a 53 51  iRowEst[0]/(2*SQ
18420 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
18430 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ES).            
18440 20 20 20 2b 20 6e 4e 6f 74 46 6f 75 6e 64 2a 70     + nNotFound*p
18450 2d 3e 61 69 52 6f 77 45 73 74 5b 31 5d 3b 0a 20  ->aiRowEst[1];. 
18460 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e     if( nRowEst >
18470 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20   p->aiRowEst[0] 
18480 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61  ) nRowEst = p->a
18490 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
184a0 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
184b0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
184c0 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  (("IN row estima
184d0 74 65 3a 20 6e 53 70 61 6e 3d 25 64 2c 20 6e 53  te: nSpan=%d, nS
184e0 69 6e 67 6c 65 3d 25 64 2c 20 6e 4e 6f 74 46 6f  ingle=%d, nNotFo
184f0 75 6e 64 3d 25 64 2c 20 65 73 74 3d 25 67 5c 6e  und=%d, est=%g\n
18500 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18510 20 20 20 20 6e 53 70 61 6e 2c 20 6e 53 69 6e 67      nSpan, nSing
18520 6c 65 2c 20 6e 4e 6f 74 46 6f 75 6e 64 2c 20 6e  le, nNotFound, n
18530 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
18540 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
18550 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
18560 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
18570 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18580 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f  ENABLE_STAT2) */
18590 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  .../*.** Find th
185a0 65 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  e best query pla
185b0 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  n for accessing 
185c0 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
185d0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  le.  Write the.*
185e0 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  * best query pla
185f0 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  n and its cost i
18600 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73  nto the WhereCos
18610 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65  t object supplie
18620 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74  d as the.** last
18630 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
18640 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
18650 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68  t plan wins.  Th
18660 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
18670 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
18680 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
18690 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65  d disk I/O neede
186a0 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
186b0 20 72 65 71 75 65 73 74 65 64 20 72 65 73 75 6c   requested resul
186c0 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68  t..** Factors th
186d0 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73  at influence cos
186e0 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  t include:.**.**
186f0 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d      *  The estim
18700 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
18710 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
18720 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68   retrieved.  (Th
18730 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72  e.**       fewer
18740 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a   the better.).**
18750 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
18760 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67  r or not sorting
18770 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   must occur..**.
18780 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
18790 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75   or not there mu
187a0 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c  st be separate l
187b0 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a  ookups in the.**
187c0 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64         index and
187d0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
187e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
187f0 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
18800 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 72  D BY clause (pSr
18810 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63  c->pIndex) attac
18820 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  hed to the table
18830 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73   in.** the SQL s
18840 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74  tatement, then t
18850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
18860 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e  y considers plan
18870 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  s using the .** 
18880 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20  named index. If 
18890 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20  no such plan is 
188a0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
188b0 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73  returned cost is
188c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  .** SQLITE_BIG_D
188d0 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73  BL. If a plan is
188e0 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73   found that uses
188f0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
18900 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  , .** then the c
18910 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65  ost is calculate
18920 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77  d in the usual w
18930 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e  ay..**.** If a N
18940 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
18950 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  e (pSrc->notInde
18960 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74 61  xed!=0) was atta
18970 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
18980 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c  e .** in the SEL
18990 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
189a0 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20 61  hen no indexes a
189b0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 48  re considered. H
189c0 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20  owever, the .** 
189d0 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d 61  selected plan ma
189e0 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64 76  y still take adv
189f0 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 62 75  antage of the bu
18a00 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70 72 69  ilt-in rowid pri
18a10 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e 64 65  mary key.** inde
18a20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
18a30 64 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  d bestBtreeIndex
18a40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18a50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18a60 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
18a70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
18a80 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
18a90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18aa0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18ab0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18ac0 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
18ad0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
18ae0 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
18af0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
18b00 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
18b10 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
18b20 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
18b30 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
18b40 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61  .  Bitmask notVa
18b50 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  lid,           /
18b60 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  * Cursors not av
18b70 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20  ailable for any 
18b80 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70  purpose */.  Exp
18b90 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
18ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18bb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18bc0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
18bd0 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
18be0 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
18bf0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
18c00 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
18c10 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
18c20 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
18c30 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
18c40 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
18c50 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
18c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
18c70 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
18c80 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
18c90 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
18ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
18cb0 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a   of pProbe, or z
18cc0 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65  ero for IPK inde
18cd0 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  x */.  int eqTer
18ce0 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
18cf0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61     /* Current ma
18d00 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
18d10 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
18d20 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72  /.  int idxEqTer
18d30 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
18d40 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66  /* Index mask of
18d50 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
18d60 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49  operators */.  I
18d70 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
18d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18d90 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
18da0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
18db0 79 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67  y key */.  unsig
18dc0 6e 65 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74  ned int aiRowEst
18dd0 50 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69  Pk[2]; /* The ai
18de0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
18df0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
18e00 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
18e10 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
18e20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
18e30 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
18e40 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
18e50 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20  int wsFlagMask; 
18e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18e70 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20  llowed flags in 
18e80 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
18e90 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  ag */..  /* Init
18ea0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20  ialize the cost 
18eb0 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20  to a worst-case 
18ec0 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  value */.  memse
18ed0 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
18ee0 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
18ef0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
18f00 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
18f10 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
18f20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
18f30 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
18f40 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
18f50 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
18f60 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
18f70 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
18f80 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
18f90 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
18fa0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
18fb0 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
18fc0 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
18fd0 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
18fe0 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
18ff0 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
19000 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
19010 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
19020 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
19030 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
19040 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
19050 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
19060 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
19070 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
19080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
19090 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
190a0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
190b0 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
190c0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
190d0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
190e0 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
190f0 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
19100 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
19110 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72  /.    pIdx = pPr
19120 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
19130 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  ex;.    wsFlagMa
19140 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
19150 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
19160 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
19170 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
19180 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73  TermMask;.  }els
19190 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
191a0 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
191b0 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
191c0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
191d0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
191e0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
191f0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
19200 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
19210 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
19220 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
19230 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
19240 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
19250 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
19260 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
19270 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
19280 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
19290 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
192a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
192b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
192c0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
192d0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
192e0 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
192f0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
19300 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
19310 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
19320 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
19330 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
19340 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
19350 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
19360 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
19370 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
19380 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
19390 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
193a0 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
193b0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
193c0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
193d0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
193e0 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
193f0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
19400 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
19410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
19420 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
19430 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
19440 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
19450 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
19460 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
19470 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
19480 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19490 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
194a0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
194b0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
194c0 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
194d0 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
194e0 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
194f0 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
19500 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
19510 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
19520 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
19530 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
19540 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
19550 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
19560 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
19570 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
19580 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
19590 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
195a0 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
195b0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
195c0 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
195d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69  const unsigned i
195e0 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77  nt * const aiRow
195f0 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Est = pProbe->ai
19600 52 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62  RowEst;.    doub
19610 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
19620 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
19630 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
19640 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52  */.    double nR
19650 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
19660 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
19670 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19680 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
19690 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30      double log10
196a0 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N;              
196b0 2f 2a 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72  /* base-10 logar
196c0 69 74 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e  ithm of nRow (in
196d0 65 78 61 63 74 29 20 2a 2f 0a 20 20 20 20 69 6e  exact) */.    in
196e0 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
196f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19700 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
19710 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
19720 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20    int wsFlags = 
19730 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75  0;.    Bitmask u
19740 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  sed = 0;..    /*
19750 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
19760 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70  ariables are pop
19770 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
19780 74 68 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f  the properties o
19790 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62  f.    ** index b
197a0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20  eing evaluated. 
197b0 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75 73  They are then us
197c0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
197d0 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20 20  the expected.   
197e0 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d   ** cost and num
197f0 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
19800 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rned..    **.   
19810 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a   **  nEq: .    *
19820 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65  *    Number of e
19830 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68  quality terms th
19840 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d  at can be implem
19850 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  ented using the 
19860 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20  index..    **   
19870 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19880 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
19890 6e 69 74 69 61 6c 20 66 69 65 6c 64 73 20 69 6e  nitial fields in
198a0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 0a   the index that.
198b0 20 20 20 20 2a 2a 20 20 20 20 61 72 65 20 75 73      **    are us
198c0 65 64 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20 6f  ed in == or IN o
198d0 72 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  r NOT NULL const
198e0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 57 48  raints of the WH
198f0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ERE clause..    
19900 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75  **.    **  nInMu
19910 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54  l:  .    **    T
19920 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65  he "in-multiplie
19930 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  r". This is an e
19940 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d  stimate of how m
19950 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69  any seek operati
19960 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53  ons .    **    S
19970 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
19980 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  rm on the index 
19990 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72  in question. For
199a0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
199b0 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52   .    **    WHER
199c0 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20  E clause is:.   
199d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
199e0 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32  WHERE a IN (1, 2
199f0 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34  , 3) AND b IN (4
19a00 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20  , 5, 6).    **. 
19a10 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
19a20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c  must perform 9 l
19a30 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64  ookups on an ind
19a40 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f  ex on (a, b), so
19a50 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20   nInMul is .    
19a60 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20  **    set to 9. 
19a70 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73  Given the same s
19a80 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72  chema and either
19a90 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19aa0 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20  g WHERE .    ** 
19ab0 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20     clauses:.    
19ac0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
19ad0 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20  HERE a =  1.    
19ae0 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
19af0 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20  >= 2.    **.    
19b00 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20  **    nInMul is 
19b10 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a  set to 1..    **
19b20 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68  .    **    If th
19b30 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45  ere exists a WHE
19b40 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  RE term of the f
19b50 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43  orm "x IN (SELEC
19b60 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20  T ...)", then . 
19b70 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62     **    the sub
19b80 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d  -select is assum
19b90 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20  ed to return 25 
19ba0 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72  rows for the pur
19bb0 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a  poses of .    **
19bc0 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20      determining 
19bd0 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20  nInMul..    **. 
19be0 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20     **  bInEst:  
19bf0 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74  .    **    Set t
19c00 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20  o true if there 
19c10 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  was at least one
19c20 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
19c30 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a  ..)" term used .
19c40 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74      **    in det
19c50 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ermining the val
19c60 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20 4e  ue of nInMul.  N
19c70 6f 74 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ote that the RHS
19c80 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20   of the.    **  
19c90 20 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75    IN operator mu
19ca0 73 74 20 62 65 20 61 20 53 45 4c 45 43 54 2c 20  st be a SELECT, 
19cb0 6e 6f 74 20 61 20 76 61 6c 75 65 20 6c 69 73 74  not a value list
19cc0 2c 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61  , for this varia
19cd0 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f  ble.    **    to
19ce0 20 62 65 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a   be true..    **
19cf0 0a 20 20 20 20 2a 2a 20 20 65 73 74 42 6f 75 6e  .    **  estBoun
19d00 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20  d:.    **    An 
19d10 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20  estimate on the 
19d20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 61  amount of the ta
19d30 62 6c 65 20 74 68 61 74 20 6d 75 73 74 20 62 65  ble that must be
19d40 20 73 65 61 72 63 68 65 64 2e 20 20 41 0a 20 20   searched.  A.  
19d50 20 20 2a 2a 20 20 20 20 76 61 6c 75 65 20 6f 66    **    value of
19d60 20 31 30 30 20 6d 65 61 6e 73 20 74 68 65 20 65   100 means the e
19d70 6e 74 69 72 65 20 74 61 62 6c 65 20 69 73 20 73  ntire table is s
19d80 65 61 72 63 68 65 64 2e 20 20 52 61 6e 67 65 20  earched.  Range 
19d90 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
19da0 2a 2a 20 20 20 20 6d 69 67 68 74 20 72 65 64 75  **    might redu
19db0 63 65 20 74 68 69 73 20 74 6f 20 61 20 76 61 6c  ce this to a val
19dc0 75 65 20 6c 65 73 73 20 74 68 61 6e 20 31 30 30  ue less than 100
19dd0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
19de0 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  t only.    **   
19df0 20 61 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 74   a fraction of t
19e00 68 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 73  he table needs s
19e10 65 61 72 63 68 69 6e 67 2e 20 20 49 6e 20 74 68  earching.  In th
19e20 65 20 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20  e absence of.   
19e30 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f 73 74   **    sqlite_st
19e40 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at2 ANALYZE data
19e50 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75  , a single inequ
19e60 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
19e70 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
19e80 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72     space to 1/4r
19e90 64 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  d its original s
19ea0 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e 3f 20  ize.  So an x>? 
19eb0 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
19ec0 65 73 0a 20 20 20 20 2a 2a 20 20 20 20 65 73 74  es.    **    est
19ed0 42 6f 75 6e 64 20 74 6f 20 32 35 2e 20 20 54 77  Bound to 25.  Tw
19ee0 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  o constraints (x
19ef0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
19f00 63 65 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 36  ce estBound to 6
19f10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19f20 20 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a   bSort:   .    *
19f30 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
19f40 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
19f50 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
19f60 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  e that will requ
19f70 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20  ire an .    **  
19f80 20 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20    external sort 
19f90 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74  (i.e. scanning t
19fa0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65  he index being e
19fb0 76 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f  valuated will no
19fc0 74 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72  t .    **    cor
19fd0 72 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63  rectly order rec
19fe0 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ords)..    **.  
19ff0 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a    **  bLookup: .
1a000 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
1a010 6e 2e 20 54 72 75 65 20 69 66 20 61 20 74 61 62  n. True if a tab
1a020 6c 65 20 6c 6f 6f 6b 75 70 20 69 73 20 72 65 71  le lookup is req
1a030 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 69  uired for each i
1a040 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20 20 2a  ndex entry.    *
1a050 2a 20 20 20 20 76 69 73 69 74 65 64 2e 20 20 49  *    visited.  I
1a060 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1a070 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6e  rue if this is n
1a080 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ot a covering in
1a090 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 54  dex..    **    T
1a0a0 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61  his is always fa
1a0b0 6c 73 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  lse for the rowi
1a0c0 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  d primary key in
1a0d0 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  dex of a table..
1a0e0 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 6f 74      **    For ot
1a0f0 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20  her indexes, it 
1a100 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61  is true unless a
1a110 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ll the columns o
1a120 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
1a130 2a 2a 20 20 20 20 75 73 65 64 20 62 79 20 74 68  **    used by th
1a140 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1a150 6e 74 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  nt are present i
1a160 6e 20 74 68 65 20 69 6e 64 65 78 20 28 73 75 63  n the index (suc
1a170 68 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 69  h an.    **    i
1a180 6e 64 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65  ndex is sometime
1a190 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 61  s described as a
1a1a0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29   covering index)
1a1b0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20  ..    **    For 
1a1c0 65 78 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74  example, given t
1a1d0 68 65 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  he index on (a, 
1a1e0 62 29 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  b), the second o
1a1f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a200 0a 20 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71  .    **    two q
1a210 75 65 72 69 65 73 20 72 65 71 75 69 72 65 73 20  ueries requires 
1a220 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f  table b-tree loo
1a230 6b 75 70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  kups in order to
1a240 20 66 69 6e 64 20 74 68 65 20 76 61 6c 75 65 0a   find the value.
1a250 20 20 20 20 2a 2a 20 20 20 20 6f 66 20 63 6f 6c      **    of col
1a260 75 6d 6e 20 63 2c 20 62 75 74 20 74 68 65 20 66  umn c, but the f
1a270 69 72 73 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  irst does not be
1a280 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 61 20  cause columns a 
1a290 61 6e 64 20 62 20 61 72 65 0a 20 20 20 20 2a 2a  and b are.    **
1a2a0 20 20 20 20 62 6f 74 68 20 61 76 61 69 6c 61 62      both availab
1a2b0 6c 65 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  le in the index.
1a2c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a2d0 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1a2e0 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d 20 74  T a, b    FROM t
1a2f0 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1a300 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a310 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20     SELECT a, b, 
1a320 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  c FROM tbl WHERE
1a330 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20   a = 1;.    */. 
1a340 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1a370 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 6d 61 74   or IN terms mat
1a380 63 68 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ching index */. 
1a390 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20     int bInEst = 
1a3a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a3b0 20 2f 2a 20 54 72 75 65 20 69 66 20 22 78 20 49   /* True if "x I
1a3c0 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 20 73  N (SELECT...)" s
1a3d0 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  een */.    int n
1a3e0 49 6e 4d 75 6c 20 3d 20 31 3b 20 20 20 20 20 20  InMul = 1;      
1a3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a400 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65  er of distinct e
1a410 71 75 61 6c 69 74 69 65 73 20 74 6f 20 6c 6f 6f  qualities to loo
1a420 6b 75 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  kup */.    int e
1a430 73 74 42 6f 75 6e 64 20 3d 20 31 30 30 3b 20 20  stBound = 100;  
1a440 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
1a450 6d 61 74 65 64 20 72 65 64 75 63 74 69 6f 6e 20  mated reduction 
1a460 69 6e 20 73 65 61 72 63 68 20 73 70 61 63 65 20  in search space 
1a470 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e  */.    int nBoun
1a480 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1a490 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a4a0 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
1a4b0 6e 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  nts seen */.    
1a4c0 69 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b 20 20  int bSort = 0;  
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4e0 20 54 72 75 65 20 69 66 20 65 78 74 65 72 6e 61   True if externa
1a4f0 6c 20 73 6f 72 74 20 72 65 71 75 69 72 65 64 20  l sort required 
1a500 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b  */.    int bLook
1a510 75 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  up = 0;         
1a520 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a530 6e 6f 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69  not a covering i
1a540 6e 64 65 78 20 2a 2f 0a 20 20 20 20 57 68 65 72  ndex */.    Wher
1a550 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1a560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1a570 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
1a580 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1a590 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a5a0 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20  ENABLE_STAT2.   
1a5b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69 72   WhereTerm *pFir
1a5c0 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f  stTerm = 0;    /
1a5d0 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6d 61 74  * First term mat
1a5e0 63 68 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ching the index 
1a5f0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  */.#endif..    /
1a600 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
1a610 76 61 6c 75 65 73 20 6f 66 20 6e 45 71 20 61 6e  values of nEq an
1a620 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20  d nInMul */.    
1a630 66 6f 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70  for(nEq=0; nEq<p
1a640 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
1a650 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  nEq++){.      in
1a660 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
1a670 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
1a680 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
1a690 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1a6a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  , notReady, eqTe
1a6b0 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  rmMask, pIdx);. 
1a6c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1a6d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1a6e0 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45   wsFlags |= (WHE
1a6f0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
1a700 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20  RE_ROWID_EQ);.  
1a710 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1a720 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
1a730 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
1a740 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
1a750 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
1a760 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1a770 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
1a780 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1a790 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1a7a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1a7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20            /* "x 
1a7c0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1a7d0 3a 20 20 41 73 73 75 6d 65 20 74 68 65 20 53 45  :  Assume the SE
1a7e0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20  LECT returns 25 
1a7f0 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rows */.        
1a800 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a    nInMul *= 25;.
1a810 20 20 20 20 20 20 20 20 20 20 62 49 6e 45 73 74            bInEst
1a820 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
1a830 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
1a840 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
1a850 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a860 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
1a870 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
1a880 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
1a890 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  )" */.          
1a8a0 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d  nInMul *= pExpr-
1a8b0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
1a8c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a8d0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1a8e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1a8f0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
1a900 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1a910 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
1a920 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
1a930 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1a940 41 54 32 0a 20 20 20 20 20 20 69 66 28 20 6e 45  AT2.      if( nE
1a950 71 3d 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e  q==0 && pProbe->
1a960 61 53 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74  aSample ) pFirst
1a970 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65  Term = pTerm;.#e
1a980 6e 64 69 66 0a 20 20 20 20 20 20 75 73 65 64 20  ndif.      used 
1a990 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
1a9a0 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  Right;.    }..  
1a9b0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
1a9c0 68 65 20 76 61 6c 75 65 20 6f 66 20 65 73 74 42  he value of estB
1a9d0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ound. */.    if(
1a9e0 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
1a9f0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  lumn ){.      in
1aa00 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
1aa10 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
1aa20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
1aa30 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
1aa40 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1aa50 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
1aa60 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
1aa70 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
1aa80 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  p = findTerm(pWC
1aa90 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1aaa0 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
1aab0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1aac0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74 6d   WhereTerm *pBtm
1aad0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1aae0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1aaf0 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1ab00 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1ab10 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
1ab20 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1ab30 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f  , nEq, pBtm, pTo
1ab40 70 2c 20 26 65 73 74 42 6f 75 6e 64 29 3b 0a 20  p, &estBound);. 
1ab50 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20         if( pTop 
1ab60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f  ){.          nBo
1ab70 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
1ab80 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1ab90 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
1aba0 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
1abb0 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67   pTop->prereqRig
1abc0 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
1abd0 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
1abe0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
1abf0 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nd++;.          
1ac00 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1ac10 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
1ac20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42        used |= pB
1ac30 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
1ac40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ac50 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57     wsFlags |= (W
1ac60 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1ac70 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  E|WHERE_ROWID_RA
1ac80 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NGE);.      }.  
1ac90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
1aca0 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1acb0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1acc0 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
1acd0 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
1ace0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1acf0 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  L );.      if( (
1ad00 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1ad10 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1ad20 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d  _COLUMN_NULL))==
1ad30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1ad40 6c 61 67 73 20 7c 3d 20 28 70 50 72 6f 62 65 2d  lags |= (pProbe-
1ad50 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1ad60 65 29 20 3f 20 57 48 45 52 45 5f 55 4e 49 51 55  e) ? WHERE_UNIQU
1ad70 45 20 3a 20 57 48 45 52 45 5f 55 4e 51 5f 57 41  E : WHERE_UNQ_WA
1ad80 4e 54 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NTED;.      }.  
1ad90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1ada0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1adb0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
1adc0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
1add0 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20  onsidered will. 
1ade0 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20     ** naturally 
1adf0 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65  scan rows in the
1ae00 20 72 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c   required order,
1ae10 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1ae20 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a  iate flags.    *
1ae30 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74  * in wsFlags. Ot
1ae40 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1ae50 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1ae60 20 63 6c 61 75 73 65 20 62 75 74 20 74 68 65 20   clause but the 
1ae70 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c  index.    ** wil
1ae80 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61  l scan rows in a
1ae90 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1aea0 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 20  , set the bSort 
1aeb0 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
1aec0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1aed0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46  {.      if( (wsF
1aee0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1aef0 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20  UMN_IN)==0.     
1af00 20 20 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49     && isSortingI
1af10 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1af20 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 50 72 6f  ->pMaskSet, pPro
1af30 62 65 2c 20 69 43 75 72 2c 20 70 4f 72 64 65 72  be, iCur, pOrder
1af40 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 45                nE
1af60 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72 65 76  q, wsFlags, &rev
1af70 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1af80 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1af90 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c  ERE_ROWID_RANGE|
1afa0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1afb0 47 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  GE|WHERE_ORDERBY
1afc0 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  ;.        wsFlag
1afd0 73 20 7c 3d 20 28 72 65 76 20 3f 20 57 48 45 52  s |= (rev ? WHER
1afe0 45 5f 52 45 56 45 52 53 45 20 3a 20 30 29 3b 0a  E_REVERSE : 0);.
1aff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b000 20 20 20 20 20 62 53 6f 72 74 20 3d 20 31 3b 0a       bSort = 1;.
1b010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b020 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74     /* If current
1b030 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74  ly calculating t
1b040 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
1b050 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74   an index (not t
1b060 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e  he IPK.    ** in
1b070 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20  dex), determine 
1b080 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20  if all required 
1b090 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20  column data may 
1b0a0 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  be obtained with
1b0b0 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e  out .    ** usin
1b0c0 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  g the main table
1b0d0 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e   (i.e. if the in
1b0e0 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e  dex is a coverin
1b0f0 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66  g.    ** index f
1b100 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e 20  or this query). 
1b110 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68  If it is, set th
1b120 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
1b130 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20   flag in.    ** 
1b140 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69  wsFlags. Otherwi
1b150 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f  se, set the bLoo
1b160 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20  kup variable to 
1b170 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  true.  */.    if
1b180 28 20 70 49 64 78 20 26 26 20 77 73 46 6c 61 67  ( pIdx && wsFlag
1b190 73 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  s ){.      Bitma
1b1a0 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  sk m = pSrc->col
1b1b0 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  Used;.      int 
1b1c0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
1b1d0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
1b1e0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1b1f0 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61   int x = pIdx->a
1b200 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1b210 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
1b220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26  ){.          m &
1b230 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29  = ~(((Bitmask)1)
1b240 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<x);.        }.
1b250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b260 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
1b270 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1b280 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
1b290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b2a0 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20    bLookup = 1;. 
1b2b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b2c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69    /*.    ** Esti
1b2d0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
1b2e0 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75  of rows of outpu
1b2f0 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49 4e  t.  For an "x IN
1b300 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20   (SELECT...)".  
1b310 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c    ** constraint,
1b320 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
1b330 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64 20  estimate exceed 
1b340 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e  half the rows in
1b350 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
1b360 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64  */.    nRow = (d
1b370 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b  ouble)(aiRowEst[
1b380 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a  nEq] * nInMul);.
1b390 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20 26      if( bInEst &
1b3a0 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73  & nRow*2>aiRowEs
1b3b0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52  t[0] ){.      nR
1b3c0 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d  ow = aiRowEst[0]
1b3d0 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c  /2;.      nInMul
1b3e0 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20   = (int)(nRow / 
1b3f0 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a  aiRowEst[nEq]);.
1b400 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1b410 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1b420 32 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  2.    /* If the 
1b430 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66  constraint is of
1b440 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55   the form x=VALU
1b450 45 20 61 6e 64 20 68 69 73 74 6f 67 72 61 6d 0a  E and histogram.
1b460 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61      ** data is a
1b470 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c  vailable for col
1b480 75 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d  umn x, then it m
1b490 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
1b4a0 0a 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61  .    ** to get a
1b4b0 20 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65   better estimate
1b4c0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
1b4d0 66 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a  f rows based on.
1b4e0 20 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64      ** VALUE and
1b4f0 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74   how common that
1b500 20 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64   value is accord
1b510 69 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f  ing to the histo
1b520 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gram..    */.   
1b530 20 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62 6c   if( nRow>(doubl
1b540 65 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26 26  e)1 && nEq==1 &&
1b550 20 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20 29   pFirstTerm!=0 )
1b560 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 72  {.      if( pFir
1b570 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1b580 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1b590 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
1b5a0 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72 73   testcase( pFirs
1b5b0 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  tTerm->eOperator
1b5c0 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
1b5d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69     testcase( pFi
1b5e0 72 73 74 54 65 72 6d 2d 3e 70 4f 70 65 72 61 74  rstTerm->pOperat
1b5f0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
1b600 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45 71  .        whereEq
1b610 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
1b620 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
1b630 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  tTerm->pExpr->pR
1b640 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  ight, &nRow);.  
1b650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46      }else if( pF
1b660 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1b670 74 6f 72 3d 3d 57 4f 5f 49 4e 20 26 26 20 62 49  tor==WO_IN && bI
1b680 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nEst==0 ){.     
1b690 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73     whereInScanEs
1b6a0 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1b6b0 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45  , pFirstTerm->pE
1b6c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
1b6d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Row);.      }.  
1b6e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1b6f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1b700 32 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64 6a  2 */..    /* Adj
1b710 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ust the number o
1b720 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 61 6e  f output rows an
1b730 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65  d downward to re
1b740 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a  flect rows.    *
1b750 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c 75  * that are exclu
1b760 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e  ded by range con
1b770 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f  straints..    */
1b780 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f  .    nRow = (nRo
1b790 77 20 2a 20 28 64 6f 75 62 6c 65 29 65 73 74 42  w * (double)estB
1b7a0 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29  ound) / (double)
1b7b0 31 30 30 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  100;.    if( nRo
1b7c0 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a  w<1 ) nRow = 1;.
1b7d0 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65  .    /* Experime
1b7e0 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20  nts run on real 
1b7f0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 73  SQLite databases
1b800 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 74   show that the t
1b810 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a  ime needed.    *
1b820 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79  * to do a binary
1b830 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74   search to locat
1b840 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62  e a row in a tab
1b850 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72  le or index is r
1b860 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f  oughly.    ** lo
1b870 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65  g10(N) times the
1b880 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72   time to move fr
1b890 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68  om one row to th
1b8a0 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69  e next row withi
1b8b0 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  n.    ** a table
1b8c0 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20   or index.  The 
1b8d0 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e  actual times can
1b8e0 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65 20   vary, with the 
1b8f0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72  size of.    ** r
1b900 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20  ecords being an 
1b910 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72  important factor
1b920 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e  .  Both moves an
1b930 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a 20  d searches are. 
1b940 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74     ** slower wit
1b950 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73  h larger records
1b960 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63  , presumably bec
1b970 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f 72  ause fewer recor
1b980 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e  ds fit.    ** on
1b990 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65   one page and he
1b9a0 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68  nce more pages h
1b9b0 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68 65  ave to be fetche
1b9c0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1b9d0 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   The ANALYZE com
1b9e0 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c  mand and the sql
1b9f0 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
1ba00 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65  lite_stat2 table
1ba10 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  s do.    ** not 
1ba20 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20  give us data on 
1ba30 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
1ba40 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20  es of table and 
1ba50 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20  index records.. 
1ba60 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f     ** So this co
1ba70 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mputation assume
1ba80 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20  s table records 
1ba90 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65 20  are about twice 
1baa0 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73  as big.    ** as
1bab0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20   index records. 
1bac0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1bad0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
1bae0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
1baf0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1bb00 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74  cost of a full t
1bb10 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20 6e  able scan is a n
1bb20 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70  umber of move op
1bb30 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20  erations equal. 
1bb40 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e       ** to the n
1bb50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1bb60 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
1bb70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
1bb80 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f 6e   add an addition
1bb90 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74 6f  al 4x penalty to
1bba0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
1bbb0 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73 0a  s.  This causes.
1bbc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73        ** the cos
1bbd0 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72  t function to er
1bbe0 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f 66  r on the side of
1bbf0 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64   choosing an ind
1bc00 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a  ex over.      **
1bc10 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c   choosing a full
1bc20 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78 20   scan.  This 4x 
1bc30 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74  full-scan penalt
1bc40 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c 65  y is an arguable
1bc50 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73 69  .      ** decisi
1bc60 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63 68  on and one which
1bc70 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72 65   we expect to re
1bc80 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75 74  visit in the fut
1bc90 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20 20  ure.  But.      
1bca0 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20 62  ** it seems to b
1bcb0 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65  e working well e
1bcc0 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f 6d  nough at the mom
1bcd0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1bce0 20 20 20 20 63 6f 73 74 20 3d 20 61 69 52 6f 77      cost = aiRow
1bcf0 45 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 7d 65  Est[0]*4;.    }e
1bd00 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30  lse{.      log10
1bd10 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77  N = estLog(aiRow
1bd20 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63  Est[0]);.      c
1bd30 6f 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  ost = nRow;.    
1bd40 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1bd50 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75        if( bLooku
1bd60 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  p ){.          /
1bd70 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c  * For an index l
1bd80 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62  ookup followed b
1bd90 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  y a table lookup
1bda0 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1bdb0 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
1bdc0 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1bdd0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1bde0 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20  h index range.  
1bdf0 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1be00 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1be10 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1be20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1be30 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1be40 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62  o lookup the tab
1be50 6c 65 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  le entry using t
1be60 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20  he rowid.       
1be70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1be80 63 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20  cost += (nInMul 
1be90 2b 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a  + nRow)*log10N;.
1bea0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1beb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1bec0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1bed0 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1bee0 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20     nInMul index 
1bef0 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1bf00 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1bf10 72 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ry .          **
1bf20 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20     + nRow steps 
1bf30 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
1bf40 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  x.          */. 
1bf50 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d           cost +=
1bf60 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a   nInMul*log10N;.
1bf70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bf80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1bf90 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72  * For a rowid pr
1bfa0 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70  imary key lookup
1bfb0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  :.        **    
1bfc0 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65  nInMult table se
1bfd0 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74  arches to find t
1bfe0 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79  he initial entry
1bff0 20 66 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a   for each range.
1c000 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1c010 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1c020 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
1c030 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
1c040 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67  st += nInMul*log
1c050 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  10N;.      }.   
1c060 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69   }..    /* Add i
1c070 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  n the estimated 
1c080 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
1c090 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74  the result.  Act
1c0a0 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ual experimental
1c0b0 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d  .    ** measurem
1c0c0 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20  ents of sorting 
1c0d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53  performance in S
1c0e0 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74 20  QLite show that 
1c0f0 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20  sorting time.   
1c100 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67   ** adds C*N*log
1c110 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73  10(N) to the cos
1c120 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  t, where N is th
1c130 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1c140 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1c150 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20 61  orted and C is a
1c160 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20   factor between 
1c170 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57  1.95 and 4.3.  W
1c180 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65  e will split the
1c190 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  .    ** differen
1c1a0 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20  ce and select C 
1c1b0 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20  of 3.0..    */. 
1c1c0 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a     if( bSort ){.
1c1d0 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52        cost += nR
1c1e0 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 2a  ow*estLog(nRow)*
1c1f0 33 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  3;.    }..    /*
1c200 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e  *** Cost of usin
1c210 67 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73  g this index has
1c220 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75 74   now been comput
1c230 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a  ed ****/..    /*
1c240 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 64   If there are ad
1c250 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61  ditional constra
1c260 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74 61 62  ints on this tab
1c270 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20  le that cannot. 
1c280 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 77 69     ** be used wi
1c290 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  th the current i
1c2a0 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63 68 20  ndex, but which 
1c2b0 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68 65 20  might lower the 
1c2c0 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66  number.    ** of
1c2d0 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20 61 64   output rows, ad
1c2e0 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20 76 61  just the nRow va
1c2f0 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  lue accordingly.
1c300 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20 20    This only .   
1c310 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66 20 74   ** matters if t
1c320 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78  he current index
1c330 20 69 73 20 74 68 65 20 6c 65 61 73 74 20 63 6f   is the least co
1c340 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  stly, so do not 
1c350 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 69  bother.    ** wi
1c360 74 68 20 74 68 69 73 20 73 74 65 70 20 69 66 20  th this step if 
1c370 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20  we already know 
1c380 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20  this index will 
1c390 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a 20  not be chosen.. 
1c3a0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76 65     ** Also, neve
1c3b0 72 20 72 65 64 75 63 65 20 74 68 65 20 6f 75 74  r reduce the out
1c3c0 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 65  put row count be
1c3d0 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68 69 73  low 2 using this
1c3e0 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20 20   step..    **.  
1c3f0 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69 74 69    ** It is criti
1c400 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e 6f 74  cal that the not
1c410 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20 75 73  Valid mask be us
1c420 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64 20  ed here instead 
1c430 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 6f  of.    ** the no
1c440 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20 57 68  tReady mask.  Wh
1c450 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20  en computing an 
1c460 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65 78 2c  "optimal" index,
1c470 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a 20 20   the notReady.  
1c480 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c 20 6f    ** mask will o
1c490 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62 69 74  nly have one bit
1c4a0 20 73 65 74 20 2d 20 74 68 65 20 62 69 74 20 66   set - the bit f
1c4b0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
1c4c0 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
1c4d0 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 2c 20   notValid mask, 
1c4e0 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  on the other han
1c4f0 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20 61 6c  d, always has al
1c500 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72 0a 20  l bits set for. 
1c510 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61     ** tables tha
1c520 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f 75 74  t are not in out
1c530 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20 6e 6f  er loops.  If no
1c540 74 52 65 61 64 79 20 69 73 20 75 73 65 64 20 68  tReady is used h
1c550 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20 20 20  ere instead.    
1c560 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64 2c 20  ** of notValid, 
1c570 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c 20 69  then a optimal i
1c580 6e 64 65 78 20 74 68 61 74 20 64 65 70 65 6e 64  ndex that depend
1c590 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69 6e 73  s on inner joins
1c5a0 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20 6d 69   loops.    ** mi
1c5b0 67 68 74 20 62 65 20 73 65 6c 65 63 74 65 64 20  ght be selected 
1c5c0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20  even when there 
1c5d0 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69 6d 61  exists an optima
1c5e0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  l index that has
1c5f0 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63 68 20  .    ** no such 
1c600 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20 20 20  dependency..    
1c610 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3e  */.    if( nRow>
1c620 32 20 26 26 20 63 6f 73 74 3c 3d 70 43 6f 73 74  2 && cost<=pCost
1c630 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  ->rCost ){.     
1c640 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c660 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1c670 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
1c680 45 71 20 3d 20 6e 45 71 3b 20 20 20 20 20 20 20  Eq = nEq;       
1c690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c6a0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
1c6b0 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20  to skip */.     
1c6c0 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67 65 20   int nSkipRange 
1c6d0 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20 2f 2a  = nBound;     /*
1c6e0 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63 6f 6e   Number of < con
1c6f0 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70  straints to skip
1c700 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73   */.      Bitmas
1c710 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20 20 20  k thisTab;      
1c720 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
1c730 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a 20 20   for pSrc */..  
1c740 20 20 20 20 74 68 69 73 54 61 62 20 3d 20 67 65      thisTab = ge
1c750 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
1c760 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  Set, iCur);.    
1c770 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
1c780 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
1c790 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b 3b 20 6b  ; nRow>2 && k; k
1c7a0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
1c7b0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1c7c0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1c7d0 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74 69 6e  VIRTUAL ) contin
1c7e0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
1c7f0 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
1c800 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29 21 3d 74  l & notValid)!=t
1c810 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69 6e 75  hisTab ) continu
1c820 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1c830 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1c840 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  & (WO_EQ|WO_IN|W
1c850 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  O_ISNULL) ){.   
1c860 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70         if( nSkip
1c870 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Eq ){.          
1c880 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1c890 66 69 72 73 74 20 6e 45 71 20 65 71 75 61 6c 69  first nEq equali
1c8a0 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e 63 65  ty matches since
1c8b0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1c8c0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
1c8d0 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20  ready accounted 
1c8e0 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20  for these */.   
1c8f0 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 45 71           nSkipEq
1c900 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  --;.          }e
1c910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1c920 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20   /* Assume each 
1c930 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75 61 6c  additional equal
1c940 69 74 79 20 6d 61 74 63 68 20 72 65 64 75 63 65  ity match reduce
1c950 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
1c960 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20           ** set 
1c970 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f 72  size by a factor
1c980 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20 20 20   of 10 */.      
1c990 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 31 30        nRow /= 10
1c9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c9b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c9c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c9d0 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c   & (WO_LT|WO_LE|
1c9e0 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a  WO_GT|WO_GE) ){.
1c9f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
1ca00 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  kipRange ){.    
1ca10 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1ca20 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
1ca30 70 52 61 6e 67 65 20 72 61 6e 67 65 20 63 6f 6e  pRange range con
1ca40 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74  straints since t
1ca50 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1ca60 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
1ca70 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f  ady accounted fo
1ca80 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20  r these */.     
1ca90 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67         nSkipRang
1caa0 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  e--;.          }
1cab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cac0 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68    /* Assume each
1cad0 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67   additional rang
1cae0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  e constraint red
1caf0 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  uces the result.
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1cb10 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63  et size by a fac
1cb20 74 6f 72 20 6f 66 20 33 2e 20 20 49 6e 64 65 78  tor of 3.  Index
1cb30 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1cb40 69 6e 74 73 20 72 65 64 75 63 65 0a 20 20 20 20  ints reduce.    
1cb50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
1cb60 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
1cb70 20 6c 61 72 67 65 72 20 66 61 63 74 6f 72 3a 20   larger factor: 
1cb80 34 2e 20 20 57 65 20 6d 61 6b 65 20 69 6e 64 65  4.  We make inde
1cb90 78 65 64 20 72 61 6e 67 65 0a 20 20 20 20 20 20  xed range.      
1cba0 20 20 20 20 20 20 2a 2a 20 6d 6f 72 65 20 73 65        ** more se
1cbb0 6c 65 63 74 69 76 65 20 69 6e 74 65 6e 74 69 6f  lective intentio
1cbc0 6e 61 6c 6c 79 20 62 65 63 61 75 73 65 20 6f 66  nally because of
1cbd0 20 74 68 65 20 73 75 62 6a 65 63 74 69 76 65 20   the subjective 
1cbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1cbf0 6f 62 73 65 72 76 61 74 69 6f 6e 20 74 68 61 74  observation that
1cc00 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   indexed range c
1cc10 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 61 6c 6c  onstraints reall
1cc20 79 20 61 72 65 20 6d 6f 72 65 0a 20 20 20 20 20  y are more.     
1cc30 20 20 20 20 20 20 20 2a 2a 20 73 65 6c 65 63 74         ** select
1cc40 69 76 65 20 69 6e 20 70 72 61 63 74 69 63 65 2c  ive in practice,
1cc50 20 6f 6e 20 61 76 65 72 61 67 65 2e 20 2a 2f 0a   on average. */.
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
1cc70 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   /= 3;.         
1cc80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1cc90 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1cca0 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f 4f 50 20 29  rator!=WO_NOOP )
1ccb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
1ccc0 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
1ccd0 69 6f 6e 20 6c 6f 77 65 72 73 20 74 68 65 20 6f  ion lowers the o
1cce0 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20  utput row count 
1ccf0 62 79 20 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20  by half */.     
1cd00 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 32 3b 0a       nRow /= 2;.
1cd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77  }.      if( nRow
1cd30 3c 32 20 29 20 6e 52 6f 77 20 3d 20 32 3b 0a 20  <2 ) nRow = 2;. 
1cd40 20 20 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45     }...    WHERE
1cd50 54 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 25  TRACE((.      "%
1cd60 73 28 25 73 29 3a 20 6e 45 71 3d 25 64 20 6e 49  s(%s): nEq=%d nI
1cd70 6e 4d 75 6c 3d 25 64 20 65 73 74 42 6f 75 6e 64  nMul=%d estBound
1cd80 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f  =%d bSort=%d bLo
1cd90 6f 6b 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d  okup=%d wsFlags=
1cda0 30 78 25 78 5c 6e 22 0a 20 20 20 20 20 20 22 20  0x%x\n".      " 
1cdb0 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79          notReady
1cdc0 3d 30 78 25 6c 6c 78 20 6c 6f 67 31 30 4e 3d 25  =0x%llx log10N=%
1cdd0 2e 31 66 20 6e 52 6f 77 3d 25 2e 31 66 20 63 6f  .1f nRow=%.1f co
1cde0 73 74 3d 25 2e 31 66 20 75 73 65 64 3d 30 78 25  st=%.1f used=0x%
1cdf0 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53  llx\n",.      pS
1ce00 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  rc->pTab->zName,
1ce10 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a   (pIdx ? pIdx->z
1ce20 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c 20 0a  Name : "ipk"), .
1ce30 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e 4d 75        nEq, nInMu
1ce40 6c 2c 20 65 73 74 42 6f 75 6e 64 2c 20 62 53 6f  l, estBound, bSo
1ce50 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46  rt, bLookup, wsF
1ce60 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f 74 52  lags,.      notR
1ce70 65 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 6e 52  eady, log10N, nR
1ce80 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a 20  ow, cost, used. 
1ce90 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49     ));..    /* I
1cea0 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1ceb0 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76 65  the best we have
1cec0 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68   seen so far, th
1ced0 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20  en record this. 
1cee0 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
1cef0 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20  its cost in the 
1cf00 70 43 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e  pCost structure.
1cf10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cf20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61 67  (!pIdx || wsFlag
1cf30 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73 74  s).     && (cost
1cf40 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c 7c  <pCost->rCost ||
1cf50 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72   (cost<=pCost->r
1cf60 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70 43 6f  Cost && nRow<pCo
1cf70 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a  st->plan.nRow)).
1cf80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 6f      ){.      pCo
1cf90 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74  st->rCost = cost
1cfa0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75  ;.      pCost->u
1cfb0 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20  sed = used;.    
1cfc0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52    pCost->plan.nR
1cfd0 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  ow = nRow;.     
1cfe0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
1cff0 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 26  lags = (wsFlags&
1d000 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20 20  wsFlagMask);.   
1d010 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
1d020 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
1d030 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
1d040 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d  dx = pIdx;.    }
1d050 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1d060 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
1d070 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1d080 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
1d090 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
1d0a0 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
1d0b0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
1d0c0 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  ex ) break;..   
1d0d0 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20   /* Reset masks 
1d0e0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64  for the next ind
1d0f0 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a  ex in the loop *
1d100 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  /.    wsFlagMask
1d110 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
1d120 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1d130 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
1d140 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
1d150 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  rmMask;.  }..  /
1d160 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
1d170 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d180 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f   and the SQLITE_
1d190 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61  ReverseOrder fla
1d1a0 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74  g.  ** is set, t
1d1b0 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20  hen reverse the 
1d1c0 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69  order that the i
1d1d0 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61  ndex will be sca
1d1e0 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68  nned.  ** in. Th
1d1f0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61  is is used for a
1d200 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69  pplication testi
1d210 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64  ng, to help find
1d220 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72   cases.  ** wher
1d230 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65  e application be
1d240 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20  haviour depends 
1d250 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65  on the (undefine
1d260 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20  d) order that.  
1d270 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74  ** SQLite output
1d280 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65  s rows in in the
1d290 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f   absence of an O
1d2a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1d2b0 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64 65   */.  if( !pOrde
1d2c0 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64  rBy && pParse->d
1d2d0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1d2e0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29  E_ReverseOrder )
1d2f0 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61  {.    pCost->pla
1d300 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1d310 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a  RE_REVERSE;.  }.
1d320 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1d330 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70  rBy || (pCost->p
1d340 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
1d350 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29 3b  E_ORDERBY)==0 );
1d360 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 73 74  .  assert( pCost
1d370 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30  ->plan.u.pIdx==0
1d380 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e   || (pCost->plan
1d390 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52  .wsFlags&WHERE_R
1d3a0 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20  OWID_EQ)==0 );. 
1d3b0 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70   assert( pSrc->p
1d3c0 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20  Index==0 .      
1d3d0 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e   || pCost->plan.
1d3e0 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20  u.pIdx==0 .     
1d3f0 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e    || pCost->plan
1d400 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70  .u.pIdx==pSrc->p
1d410 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57  Index .  );..  W
1d420 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74  HERETRACE(("best
1d430 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22   index is: %s\n"
1d440 2c 20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d 3e  , .    ((pCost->
1d450 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1d460 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
1d470 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20 3a  N)==0 ? "none" :
1d480 20 0a 20 20 20 20 20 20 20 20 20 70 43 6f 73 74   .         pCost
1d490 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20  ->plan.u.pIdx ? 
1d4a0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
1d4b0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
1d4c0 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65  ").  ));.  .  be
1d4d0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
1d4e0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1d4f0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
1d500 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
1d510 20 70 43 6f 73 74 29 3b 0a 20 20 62 65 73 74 41   pCost);.  bestA
1d520 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50  utomaticIndex(pP
1d530 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1d540 20 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f 73 74   notReady, pCost
1d550 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  );.  pCost->plan
1d560 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54 65  .wsFlags |= eqTe
1d570 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rmMask;.}../*.**
1d580 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79 20   Find the query 
1d590 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69  plan for accessi
1d5a0 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e 70  ng table pSrc->p
1d5b0 54 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a 2a  Tab. Write the.*
1d5c0 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61  * best query pla
1d5d0 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  n and its cost i
1d5e0 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73  nto the WhereCos
1d5f0 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65  t object supplie
1d600 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61 73  d .** as the las
1d610 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69  t parameter. Thi
1d620 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63  s function may c
1d630 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73  alculate the cos
1d640 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61  t of.** both rea
1d650 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61  l and virtual ta
1d660 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74  ble scans..*/.st
1d670 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e  atic void bestIn
1d680 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
1d690 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1d6a0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1d6b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1d6c0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1d6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d6e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1d6f0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1d700 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
1d710 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d720 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
1d730 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
1d740 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
1d750 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
1d760 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
1d770 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ble for indexing
1d780 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1d790 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20  tValid,         
1d7a0 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74    /* Cursors not
1d7b0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
1d7c0 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20  ny purpose */.  
1d7d0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1d7e0 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  By,         /* T
1d7f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1d800 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  se */.  WhereCos
1d810 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20  t *pCost        
1d820 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f      /* Lowest co
1d830 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  st query plan */
1d840 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1d850 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1d860 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
1d870 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1d880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d890 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d 20  index_info *p = 
1d8a0 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74 75  0;.    bestVirtu
1d8b0 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  alIndex(pParse, 
1d8c0 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1d8d0 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70  ady, notValid, p
1d8e0 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 26  OrderBy, pCost,&
1d8f0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  p);.    if( p->n
1d900 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1d910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d920 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29  _free(p->idxStr)
1d930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d940 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1d950 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c 73  ->db, p);.  }els
1d960 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1d970 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
1d980 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1d990 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
1d9a0 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
1d9b0 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a   pCost);.  }.}..
1d9c0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
1d9d0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
1d9e0 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
1d9f0 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
1da00 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
1da10 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
1da20 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
1da30 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
1da40 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
1da50 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
1da60 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
1da70 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
1da80 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
1da90 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
1daa0 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
1dab0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
1dac0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
1dad0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
1dae0 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
1daf0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
1db00 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1db10 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
1db20 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
1db30 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
1db40 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
1db50 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
1db60 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
1db70 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
1db80 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
1db90 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
1dba0 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
1dbb0 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
1dbc0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
1dbd0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
1dbe0 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
1dbf0 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
1dc00 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
1dc10 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
1dc20 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
1dc30 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
1dc40 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
1dc50 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37  TION-OF: R-24597
1dc60 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20  -58655 No tests 
1dc70 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72  are done for ter
1dc80 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  ms that are.** c
1dc90 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66  ompletely satisf
1dca0 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a  ied by indices..
1dcb0 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
1dcc0 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
1dcd0 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
1dce0 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
1dcf0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
1dd00 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
1dd10 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
1dd20 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
1dd30 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
1dd40 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
1dd50 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
1dd60 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
1dd70 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
1dd80 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
1dd90 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
1dda0 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
1ddb0 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
1ddc0 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
1ddd0 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
1dde0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1ddf0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
1de00 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
1de10 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
1de20 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
1de30 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
1de40 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
1de50 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
1de60 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
1de70 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
1de80 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
1de90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
1dea0 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
1deb0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
1dec0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
1ded0 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20  .  if( pTerm.   
1dee0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
1def0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1df00 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
1df10 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
1df20 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
1df30 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
1df40 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1df50 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
1df60 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
1df70 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
1df80 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
1df90 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
1dfa0 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
1dfb0 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
1dfc0 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
1dfd0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
1dfe0 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
1dff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
1e000 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1e010 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
1e020 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1e030 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
1e040 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65  _Affinity opcode
1e050 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f   to apply the co
1e060 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
1e070 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20  ring zAff.** to 
1e080 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20  the n registers 
1e090 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65  starting at base
1e0a0 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f  . .**.** As an o
1e0b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c  ptimization, SQL
1e0c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
1e0d0 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65 20  ries (which are 
1e0e0 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a  no-ops) at the.*
1e0f0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  * beginning and 
1e100 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20  end of zAff are 
1e110 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c  ignored.  If all
1e120 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66   entries in zAff
1e130 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41   are.** SQLITE_A
1e140 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f  FF_NONE, then no
1e150 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72   code gets gener
1e160 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
1e170 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
1e180 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a  ts own copy of z
1e190 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65 20  Aff so that the 
1e1a0 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a  caller is free.*
1e1b0 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66  * to modify zAff
1e1c0 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
1e1d0 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a  ine returns..*/.
1e1e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1e1f0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
1e200 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1e210 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68   base, int n, ch
1e220 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62  ar *zAff){.  Vdb
1e230 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e240 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66  Vdbe;.  if( zAff
1e250 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1e260 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
1e270 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1e280 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1e290 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1e2a0 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61  ..  /* Adjust ba
1e2b0 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70  se and n to skip
1e2c0 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46   over SQLITE_AFF
1e2d0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74  _NONE entries at
1e2e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
1e2f0 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74   ** and end of t
1e300 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
1e310 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ng..  */.  while
1e320 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d  ( n>0 && zAff[0]
1e330 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1e340 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
1e350 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41    base++;.    zA
1e360 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  ff++;.  }.  whil
1e370 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e  e( n>1 && zAff[n
1e380 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  -1]==SQLITE_AFF_
1e390 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b  NONE ){.    n--;
1e3a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  .  }..  /* Code 
1e3b0 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
1e3c0 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65 20  opcode if there 
1e3d0 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74  is anything left
1e3e0 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28   to do. */.  if(
1e3f0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   n>0 ){.    sqli
1e400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e410 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
1e420 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  se, n);.    sqli
1e430 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1e440 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b  v, -1, zAff, n);
1e450 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e460 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1e470 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  nge(pParse, base
1e480 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
1e490 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e4a0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65  e for a single e
1e4b0 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20  quality term of 
1e4c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1e4d0 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a  .  An equality.*
1e4e0 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69  * term can be ei
1e4f0 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58  ther X=expr or X
1e500 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65   IN (...).   pTe
1e510 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74  rm is the term t
1e520 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a  o be .** coded..
1e530 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
1e540 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1e550 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65  constraint is le
1e560 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ft in register i
1e570 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  Reg..**.** For a
1e580 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
1e590 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
1e5a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e5b0 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
1e5c0 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
1e5d0 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
1e5e0 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
1e5f0 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
1e600 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
1e610 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1e620 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
1e630 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
1e640 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
1e650 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  X..*/.static int
1e660 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1e670 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1e680 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
1e690 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1e6a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1e6b0 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
1e6c0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
1e6d0 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
1e6e0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1e6f0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a  evel *pLevel, /*
1e700 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
1e710 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
1e720 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
1e730 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65   */.  int iTarge
1e740 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74  t         /* Att
1e750 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65  empt to leave re
1e760 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65  sults in this re
1e770 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45  gister */.){.  E
1e780 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
1e790 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a  >pExpr;.  Vdbe *
1e7a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1e7b0 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20  e;.  int iReg;  
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7d0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
1e7e0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a  ing results */..
1e7f0 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65    assert( iTarge
1e800 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d  t>0 );.  if( pX-
1e810 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
1e820 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1e830 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1e840 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1e850 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
1e860 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
1e870 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
1e880 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
1e890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e8a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1e8b0 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
1e8c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e8d0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
1e8e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
1e8f0 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
1e900 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
1e910 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
1e920 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
1e930 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
1e940 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
1e950 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
1e960 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
1e970 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
1e980 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
1e990 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e9a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
1e9b0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
1e9c0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1e9d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1e9e0 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
1e9f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
1ea00 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29  l->u.in.nIn==0 )
1ea10 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
1ea20 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1ea30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ea40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
1ea50 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b  vel->u.in.nIn++;
1ea60 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  .    pLevel->u.i
1ea70 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20  n.aInLoop =.    
1ea80 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c     sqlite3DbReal
1ea90 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
1eaa0 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  ->db, pLevel->u.
1eab0 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20  in.aInLoop,.    
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1eae0 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  (pLevel->u.in.aI
1eaf0 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
1eb00 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20  ->u.in.nIn);.   
1eb10 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75   pIn = pLevel->u
1eb20 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  .in.aInLoop;.   
1eb30 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20   if( pIn ){.    
1eb40 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    pIn += pLevel-
1eb50 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20  >u.in.nIn - 1;. 
1eb60 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d       pIn->iCur =
1eb70 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28   iTab;.      if(
1eb80 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1eb90 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
1eba0 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
1ebb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1ebc0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1ebd0 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20  , iTab, iReg);. 
1ebe0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ebf0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
1ec00 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1ec10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1ec20 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
1ec30 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
1ec40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ec50 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
1ec60 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
1ec70 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
1ec80 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
1ec90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1eca0 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
1ecb0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
1ecc0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1ecd0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ece0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1ecf0 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
1ed00 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
1ed10 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
1ed20 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ex..**.** For ex
1ed30 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
1ed40 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
1ed50 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
1ed60 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
1ed70 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
1ed80 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
1ed90 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
1eda0 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
1edb0 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
1edc0 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
1edd0 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
1ede0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
1edf0 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
1ee00 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
1ee10 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
1ee20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
1ee30 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
1ee40 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1ee50 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
1ee60 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
1ee70 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1ee80 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
1ee90 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
1eea0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1eeb0 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
1eec0 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
1eed0 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
1eee0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1eef0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
1ef00 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
1ef10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1ef20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
1ef30 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
1ef40 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
1ef50 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1ef60 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
1ef70 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
1ef80 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
1ef90 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
1efa0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
1efb0 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
1efc0 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
1efd0 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
1efe0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a  memory cell and.
1eff0 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  ** compute the a
1f000 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a  ffinity string..
1f010 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f020 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ne always alloca
1f030 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  tes at least one
1f040 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1f050 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1f060 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65  index of that me
1f070 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63  mory cell. The c
1f080 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c  ode that.** call
1f090 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1f0a0 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d  ill use that mem
1f0b0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72  ory cell to stor
1f0c0 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
1f0d0 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f  n.** key value o
1f0e0 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
1f0f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f  one or more IN o
1f100 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c  perators appear,
1f110 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
1f120 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
1f130 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45  an additional nE
1f140 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  q memory cells f
1f150 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1f160 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  se..**.** Before
1f170 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41   returning, *pzA
1f180 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ff is set to poi
1f190 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
1f1a0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63  ontaining a.** c
1f1b0 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
1f1c0 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1f1d0 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  g of the index a
1f1e0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
1f1f0 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  * sqlite3DbMallo
1f200 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74  c(). Except, ent
1f210 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79  ries in the copy
1f220 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
1f230 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1f240 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  h equality const
1f250 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20  raints that use 
1f260 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72  NONE affinity ar
1f270 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49  e set to.** SQLI
1f280 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69  TE_AFF_NONE. Thi
1f290 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74  s is to deal wit
1f2a0 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68  h SQL such as th
1f2b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
1f2c0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1f2d0 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d  E t1(a TEXT PRIM
1f2e0 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20  ARY KEY, b);.** 
1f2f0 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
1f300 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57  M t1 AS t2, t1 W
1f310 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62  HERE t1.a = t2.b
1f320 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ;.**.** In the e
1f330 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
1f340 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29  e index on t1(a)
1f350 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69   has TEXT affini
1f360 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a  ty. But since.**
1f370 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1f380 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61  side of the equa
1f390 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1f3a0 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20  (t2.b) has NONE 
1f3b0 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20  affinity,.** no 
1f3c0 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c  conversion shoul
1f3d0 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62  d be attempted b
1f3e0 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32  efore using a t2
1f3f0 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74  .b value as part
1f400 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20   of.** a key to 
1f410 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  search the index
1f420 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73  . Hence the firs
1f430 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65  t byte in the re
1f440 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a  turned affinity.
1f450 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69  ** string in thi
1f460 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20  s example would 
1f470 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1f480 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74  _AFF_NONE..*/.st
1f490 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
1f4a0 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
1f4b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f4c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1f4d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1f4e0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1f4f0 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
1f500 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
1f510 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
1f520 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
1f530 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
1f540 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1f550 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
1f560 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
1f570 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
1f580 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
1f590 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
1f5a0 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c    int nExtraReg,
1f5b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f5c0 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
1f5d0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1f5e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41   */.  char **pzA
1f5f0 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ff          /* O
1f600 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74  UT: Set to point
1f610 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72   to affinity str
1f620 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
1f630 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
1f640 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65  an.nEq;   /* The
1f650 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
1f660 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
1f670 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62  to code */.  Vdb
1f680 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1f690 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
1f6a0 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
1f6b0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
1f6c0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1f6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f6e0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
1f6f0 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
1f700 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
1f710 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
1f720 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
1f730 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
1f740 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1f750 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1f760 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
1f770 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
1f780 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1f7b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
1f7c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f7d0 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1f7e0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ster */.  int nR
1f7f0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1f800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f810 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  r of registers t
1f820 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
1f830 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20  char *zAff;     
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f850 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
1f860 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
1f870 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20   /* This module 
1f880 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f  is only called o
1f890 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68  n query plans th
1f8a0 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e  at use an index.
1f8b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c   */.  assert( pL
1f8c0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1f8d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1f8e0 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70  ED );.  pIdx = p
1f8f0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
1f900 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  dx;..  /* Figure
1f910 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65   out how many me
1f920 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69  mory cells we wi
1f930 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c  ll need then all
1f940 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocate them..  */
1f950 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61  .  regBase = pPa
1f960 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
1f970 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e   nReg = pLevel->
1f980 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72  plan.nEq + nExtr
1f990 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
1f9a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
1f9b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
1f9c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1f9d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
1f9e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
1f9f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
1fa00 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
1fa10 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1fa20 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
1fa30 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
1fa40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1fa50 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1fa60 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
1fa70 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
1fa80 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
1fa90 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20  .    int r1;.   
1faa0 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61   int k = pIdx->a
1fab0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1fac0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
1fad0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
1fae0 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d  otReady, pLevel-
1faf0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70  >plan.wsFlags, p
1fb00 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  Idx);.    if( NE
1fb10 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20  VER(pTerm==0) ) 
1fb20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68  break;.    /* Th
1fb30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65  e following true
1fb40 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74   for indices wit
1fb50 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  h redundant colu
1fb60 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a  mns. .    ** Ex:
1fb70 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
1fb80 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53   ON t1(a,b,a); S
1fb90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1fba0 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d  WHERE a=0 AND b=
1fbb0 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61  0; */.    testca
1fbc0 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  se( (pTerm->wtFl
1fbd0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1fbe0 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
1fbf0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1fc00 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1fc10 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
1fc20 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
1fc30 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61     r1 = codeEqua
1fc40 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1fc50 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1fc60 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1fc70 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b  if( r1!=regBase+
1fc80 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  j ){.      if( n
1fc90 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Reg==1 ){.      
1fca0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1fcb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1fcc0 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20  regBase);.      
1fcd0 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a    regBase = r1;.
1fce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fcf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fd00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1fd10 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b  py, r1, regBase+
1fd20 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1fd30 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1fd40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1fd50 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
1fd60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1fd70 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1fd80 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
1fd90 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1fda0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
1fdb0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
1fdc0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1fdd0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
1fde0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1fdf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1fe00 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
1fe10 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ght, regBase+j, 
1fe20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
1fe30 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  ;.      if( zAff
1fe40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1fe50 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1fe60 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1fe70 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1fe80 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1fe90 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1fea0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1feb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fec0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1fed0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1fee0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1fef0 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1ff00 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1ff10 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1ff20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ff30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1ff40 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1ff50 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1ff60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ff70 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1ff80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ff90 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1ffa0 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1ffb0 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1ffc0 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1ffd0 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1ffe0 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1fff0 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
20000 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
20010 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
20020 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
20030 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
20040 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20050 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
20060 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
20070 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
20080 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
20090 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
200a0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
200b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
200c0 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
200d0 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
200e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
200f0 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
20100 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
20110 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
20120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20130 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
20140 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
20150 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
20160 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
20170 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
20180 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
20190 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
201a0 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
201b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
201c0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
201d0 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
201e0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
201f0 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
20200 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
20210 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
20220 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29  tr, zColumn, -1)
20230 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
20240 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
20250 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  zOp, 1);.  sqlit
20260 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
20270 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a  (pStr, "?", 1);.
20280 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
20290 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62  t pLevel describ
202a0 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f  es a strategy fo
202b0 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65  r scanning table
202c0 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20   pTab. This .** 
202d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
202e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
202f0 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f  string buffer co
20300 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72  ntaining a descr
20310 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
20320 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65   subset of table
20330 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
20340 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
20350 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a   the form of an.
20360 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ** SQL expressio
20370 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f  n. Or, if all ro
20380 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20  ws are scanned, 
20390 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
203a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
203b0 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
203c0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
203d0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
203e0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
203f0 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
20400 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
20410 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
20420 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
20430 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
20440 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
20450 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
20460 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20   b>?".**.** The 
20470 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
20480 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
20490 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
204a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
204b0 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
204c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
204d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
204e0 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
204f0 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f  when it is.** no
20500 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
20510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
20520 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61   *explainIndexRa
20530 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nge(sqlite3 *db,
20540 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
20550 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  vel, Table *pTab
20560 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 2a  ){.  WherePlan *
20570 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d  pPlan = &pLevel-
20580 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a  >plan;.  Index *
20590 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e  pIndex = pPlan->
205a0 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45  u.pIdx;.  int nE
205b0 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a  q = pPlan->nEq;.
205c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
205d0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
205e0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a  b->aCol;.  int *
205f0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
20600 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
20610 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
20620 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
20630 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20  Plan->wsFlags & 
20640 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
20650 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
20660 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
20670 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
20680 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
20690 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
206a0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
206b0 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
206c0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
206d0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
206e0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
206f0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
20700 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
20710 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61  dTerm(&txt, i, a
20720 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
20730 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20  .zName, "=");.  
20740 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
20750 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73  ( pPlan->wsFlags
20760 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
20770 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41   ){.    explainA
20780 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
20790 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75  i++, aCol[aiColu
207a0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3e  mn[j]].zName, ">
207b0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ");.  }.  if( pP
207c0 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  lan->wsFlags&WHE
207d0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
207e0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
207f0 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61  dTerm(&txt, i, a
20800 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
20810 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29 3b 0a 20 20  .zName, "<");.  
20820 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
20830 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
20840 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  ")", 1);.  retur
20850 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  n sqlite3StrAccu
20860 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d  mFinish(&txt);.}
20870 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20880 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
20890 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74 6c   unless currentl
208a0 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  y processing an 
208b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
208c0 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49  AN.** command. I
208d0 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69 6e  f the query bein
208e0 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e  g compiled is an
208f0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
20900 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  LAN, a single.**
20910 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64   record is added
20920 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 74   to the output t
20930 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  o describe the t
20940 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74 65  able scan strate
20950 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c  gy in .** pLevel
20960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20970 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
20980 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
209a0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
209b0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
209c0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
209d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
209e0 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70  e list this loop
209f0 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20   refers to */.  
20a00 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
20a10 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
20a20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65  /* Scan to write
20a30 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f   OP_Explain opco
20a40 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  de for */.  int 
20a50 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
20a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
20a70 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22  alue for "level"
20a80 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75   column of outpu
20a90 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
20aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20ab0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
20ac0 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d  for "from" colum
20ad0 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  n of output */. 
20ae0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
20b10 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
20b20 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  Begin() */.){.  
20b30 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
20b40 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33  ain==2 ){.    u3
20b50 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  2 flags = pLevel
20b60 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
20b70 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
20b80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
20b90 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
20ba0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
20bb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
20bc0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
20bd0 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
20be0 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
20bf0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20c00 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
20c10 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
20c20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
20c30 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
20c40 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
20c50 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
20c60 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
20c70 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20 20  _int64 nRow;    
20c80 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
20c90 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
20ca0 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63 61  s visited by sca
20cb0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  n */.    int iId
20cc0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
20cd0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
20ce0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
20cf0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
20d00 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
20d10 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
20d20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
20d30 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
20d40 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20  or SCAN. */..   
20d50 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52   if( (flags&WHER
20d60 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28  E_MULTI_OR) || (
20d70 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
20d80 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
20d90 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ) return;..    i
20da0 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76 65  sSearch = (pLeve
20db0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20  l->plan.nEq>0). 
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
20dd0 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d  flags&(WHERE_BTM
20de0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
20df0 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20  _LIMIT))!=0.    
20e00 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74           || (wct
20e10 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f  rlFlags&(WHERE_O
20e20 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45  RDERBY_MIN|WHERE
20e30 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a  _ORDERBY_MAX));.
20e40 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
20e50 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
20e60 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22 53  %s", isSearch?"S
20e70 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a  EARCH":"SCAN");.
20e80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
20e90 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
20ea0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
20eb0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
20ec0 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25 64   "%s SUBQUERY %d
20ed0 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69  ", zMsg,pItem->i
20ee0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 7d  SelectId);.    }
20ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67  else{.      zMsg
20f00 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
20f10 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
20f20 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67   TABLE %s", zMsg
20f30 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
20f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
20f50 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
20f60 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
20f70 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
20f80 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
20f90 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
20fa0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a  >zAlias);.    }.
20fb0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
20fc0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
20fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
20fe0 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c 61   *zWhere = expla
20ff0 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62 2c  inIndexRange(db,
21000 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e   pLevel, pItem->
21010 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73  pTab);.      zMs
21020 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
21030 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
21040 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44 45  s USING %s%sINDE
21050 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20  X%s%s%s", zMsg, 
21060 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
21070 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
21080 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54 49  INDEX)?"AUTOMATI
21090 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  C ":""),.       
210a0 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
210b0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f  RE_IDX_ONLY)?"CO
210c0 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20  VERING ":""),.  
210d0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
210e0 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
210f0 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20  EX)?"":" "),.   
21100 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
21110 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
21120 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70  X)?"": pLevel->p
21130 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
21140 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 57  e),.          zW
21150 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  here.      );.  
21160 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21170 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20  e(db, zWhere);. 
21180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
21190 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
211a0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
211b0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
211c0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
211d0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
211e0 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45  , "%s USING INTE
211f0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
21200 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20  , zMsg);..      
21210 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
21220 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
21230 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
21240 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
21250 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3d  Msg, "%s (rowid=
21260 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
21270 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
21280 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
21290 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
212a0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
212b0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
212c0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
212d0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 20  g, "%s (rowid>? 
212e0 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a  AND rowid<?)", z
212f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
21300 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
21310 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
21320 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
21330 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
21340 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
21350 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id>?)", zMsg);. 
21360 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
21370 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c  lags&WHERE_TOP_L
21380 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
21390 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
213a0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
213b0 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c   "%s (rowid<?)",
213c0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
213d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
213e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
213f0 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65 20  LTABLE.    else 
21400 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
21410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
21420 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
21430 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
21440 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
21450 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
21460 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  Idx;.      zMsg 
21470 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
21480 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
21490 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
214a0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
214b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
214c0 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69 64      pVtabIdx->id
214d0 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e  xNum, pVtabIdx->
214e0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
214f0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 63  endif.    if( wc
21500 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
21510 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
21520 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20 29  E_ORDERBY_MAX) )
21530 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
21540 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
21550 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
21560 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d   );.      nRow =
21570 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
21580 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c       nRow = (sql
21590 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76 65  ite3_int64)pLeve
215a0 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20  l->plan.nRow;.  
215b0 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73    }.    zMsg = s
215c0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
215d0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25  b, zMsg, "%s (~%
215e0 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
215f0 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  , nRow);.    sql
21600 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21610 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49  , OP_Explain, iI
21620 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d  d, iLevel, iFrom
21630 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
21640 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
21650 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
21660 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78  nOneScan(u,v,w,x
21670 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
21680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
21690 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  AIN */.../*.** G
216a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
216b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
216c0 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70  e iLevel-th loop
216d0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
216e0 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ause.** implemen
216f0 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  tation described
21700 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73   by pWInfo..*/.s
21710 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
21720 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a  deOneLoopStart(.
21730 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
21740 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65  nfo,   /* Comple
21750 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
21760 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
21770 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
21780 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
21790 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f  /* Which level o
217a0 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68  f pWInfo->a[] sh
217b0 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f  ould be coded */
217c0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
217d0 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  s,      /* One o
217e0 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
217f0 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
21800 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20  qliteInt.h */.  
21810 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
21820 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
21830 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
21840 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
21850 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
21860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21870 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
21880 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
21890 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
218a0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
218b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
218c0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
218d0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
218e0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
218f0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
21900 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
21910 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
21920 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
21930 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
21940 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
21950 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21960 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
21970 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
21980 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
21990 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
219a0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
219b0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
219c0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
219d0 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70  WC;    /* Decomp
219e0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  osition of the e
219f0 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75  ntire WHERE clau
21a00 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
21a10 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
21a20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45          /* A WHE
21a30 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  RE clause term *
21a40 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
21a50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21a60 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21a70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65  ontext */.  Vdbe
21a80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
21a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21aa0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  he prepared stmt
21ab0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
21ac0 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ions */.  struct
21ad0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21ae0 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f  TabItem;  /* FRO
21af0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
21b00 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
21b10 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20  nt addrBrk;     
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b30 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
21b40 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
21b50 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
21b60 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20  drCont;         
21b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
21b80 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
21b90 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63  ue with next cyc
21ba0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  le */.  int iRow
21bb0 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  idReg = 0;      
21bc0 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74    /* Rowid is st
21bd0 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67  ored in this reg
21be0 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65  ister, if not ze
21bf0 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c  ro */.  int iRel
21c00 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20  easeReg = 0;    
21c10 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
21c20 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72  er to free befor
21c30 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a  e returning */..
21c40 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
21c50 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d  o->pParse;.  v =
21c60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
21c70 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e    pWC = pWInfo->
21c80 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  pWC;.  pLevel = 
21c90 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65  &pWInfo->a[iLeve
21ca0 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  l];.  pTabItem =
21cb0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
21cc0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
21cd0 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
21ce0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
21cf0 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76  ;.  bRev = (pLev
21d00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
21d10 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   & WHERE_REVERSE
21d20 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c  )!=0;.  omitTabl
21d30 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  e = (pLevel->pla
21d40 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
21d50 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a  E_IDX_ONLY)!=0 .
21d60 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
21d70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21d80 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
21d90 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  0;..  /* Create 
21da0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
21db0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
21dc0 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
21dd0 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
21de0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
21df0 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
21e00 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
21e10 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
21e20 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
21e30 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
21e40 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
21e50 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
21e60 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
21e70 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
21e80 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
21e90 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
21ea0 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
21eb0 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
21ec0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
21ed0 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
21ee0 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
21ef0 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
21f00 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
21f10 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
21f20 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
21f30 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
21f40 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
21f50 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
21f60 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
21f70 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
21f80 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
21f90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21fa0 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
21fb0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
21fc0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
21fd0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
21fe0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
21ff0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
22000 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
22010 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
22020 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
22030 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
22040 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
22050 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
22060 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
22070 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
22080 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
22090 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
220a0 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
220b0 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
220c0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
220d0 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
220e0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
220f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
22100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22110 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22120 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
22130 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
22140 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
22150 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
22160 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
22170 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22180 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22190 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65  LE.  if(  (pLeve
221a0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
221b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
221c0 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
221d0 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
221e0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
221f0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
22200 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
22210 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  Next.    **     
22220 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
22230 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  he data..    */.
22240 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20      int iReg;   
22250 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20  /* P3 Value for 
22260 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20  OP_VFilter */.  
22270 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
22280 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
22290 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
222a0 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e  pVtabIdx;.    in
222b0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
222c0 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74  pVtabIdx->nConst
222d0 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63  raint;.    struc
222e0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
222f0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
22300 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
22340 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
22350 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Usage;.    const
22360 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
22370 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
22380 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
223d0 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69  raint;..    sqli
223e0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
223f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
22400 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
22410 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
22420 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
22430 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
22440 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  =nConstraint; j+
22450 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  +){.      for(k=
22460 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; k<nConstraint
22470 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
22480 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72  if( aUsage[k].ar
22490 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20  gvIndex==j ){.  
224a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
224b0 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
224c0 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
224d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
224e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
224f0 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  , pWC->a[iTerm].
22500 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
22510 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20  Reg+j+1);.      
22520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22530 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22540 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
22550 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
22560 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22580 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49  _Integer, pVtabI
22590 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67  dx->idxNum, iReg
225a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
225b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
225c0 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65  nteger, j-1, iRe
225d0 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g+1);.    sqlite
225e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
225f0 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
22600 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20   addrBrk, iReg, 
22610 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72  pVtabIdx->idxStr
22620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22630 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
22640 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
22650 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  tr ? P4_MPRINTF 
22660 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
22670 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
22680 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
22690 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
226a0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
226b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55  +){.      if( aU
226c0 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
226d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
226e0 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
226f0 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  j].iTermOffset;.
22700 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
22710 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43  erm(pLevel, &pWC
22720 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  ->a[iTerm]);.   
22730 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
22740 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
22750 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Next;.    pLevel
22760 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
22770 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
22780 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
22790 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
227a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
227b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65  ange(pParse, iRe
227c0 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  g, nConstraint+2
227d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
227e0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
227f0 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  e, 1);.  }else.#
22800 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22810 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
22820 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76  E */..  if( pLev
22830 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
22840 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
22850 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  Q ){.    /* Case
22860 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
22870 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
22880 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
22890 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
228a0 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
228b0 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
228c0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
228d0 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
228e0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
228f0 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
22900 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
22910 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
22920 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
22930 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
22940 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
22950 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
22960 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65  pParse);.    pTe
22970 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
22980 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
22990 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
229a0 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  IN, 0);.    asse
229b0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
229c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
229d0 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
229e0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
229f0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
22a00 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ur );.    assert
22a10 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
22a20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
22a30 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
22a40 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
22a50 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
22a60 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f  11662 */.    iRo
22a70 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75  widReg = codeEqu
22a80 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
22a90 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
22aa0 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
22ab0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
22ac0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
22ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ae0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
22af0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
22b00 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71  addrNxt);.    sq
22b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
22b20 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
22b30 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20   iCur, addrNxt, 
22b40 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
22b50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22b60 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
22b70 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
22b80 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
22b90 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
22ba0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
22bb0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
22bc0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
22bd0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
22be0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
22bf0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a  {.    /* Case 2:
22c00 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
22c10 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
22c20 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
22c30 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
22c40 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
22c50 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
22c60 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
22c70 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
22c80 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
22c90 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
22ca0 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
22cb0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
22cc0 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
22cd0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
22ce0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
22cf0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
22d00 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
22d10 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
22d20 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
22d30 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
22d40 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
22d50 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
22d60 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74  rt;.      pStart
22d70 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70   = pEnd;.      p
22d80 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
22d90 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72   }.    if( pStar
22da0 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
22db0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
22dc0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
22dd0 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  on that defines 
22de0 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20  the start bound 
22df0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  */.      int r1,
22e00 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f   rTemp;        /
22e10 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20  * Registers for 
22e20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72  holding the star
22e30 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20  t boundary */.. 
22e40 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
22e50 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d  owing constant m
22e60 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20  aps TK_xx codes 
22e70 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  into correspondi
22e80 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65  ng .      ** see
22e90 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64  k opcodes.  It d
22ea0 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74  epends on a part
22eb0 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20  icular ordering 
22ec0 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a  of TK_xx.      *
22ed0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
22ee0 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20   aMoveOp[] = {. 
22ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
22f00 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74  GT */  OP_SeekGt
22f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
22f20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LE */  OP_See
22f30 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLe,.           
22f40 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f  /* TK_LT */  OP_
22f50 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20  SeekLt,.        
22f60 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20     /* TK_GE */  
22f70 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20  OP_SeekGe.      
22f80 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  };.      assert(
22f90 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20   TK_LE==TK_GT+1 
22fa0 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );      /* Make 
22fb0 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e  sure the orderin
22fc0 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  g.. */.      ass
22fd0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
22fe0 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20  T+2 );      /*  
22ff0 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78  ... of the TK_xx
23000 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20   values... */.  
23010 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
23020 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20  E==TK_GT+3 );   
23030 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f     /*  ... is co
23040 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20  rrecct. */..    
23050 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
23060 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
23070 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
23080 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
23090 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d  62 */.      pX =
230a0 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
230b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
230c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
230d0 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
230e0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
230f0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
23100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
23110 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
23120 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
23130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23140 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
23150 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
23160 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
23170 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23180 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
23190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
231a0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
231b0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
231c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
231d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
231e0 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
231f0 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
23200 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
23210 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
23220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23230 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
23240 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
23250 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
23260 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rBrk);.    }.   
23270 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20   if( pEnd ){.   
23280 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
23290 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
232a0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
232b0 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
232c0 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
232d0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
232e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
232f0 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67  se( pEnd->wtFlag
23300 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
23310 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
23320 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
23330 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20    memEndValue = 
23340 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23350 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23360 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
23370 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64  ->pRight, memEnd
23380 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
23390 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
233a0 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
233b0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
233c0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
233d0 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
233e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
233f0 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
23400 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
23410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73       }.      dis
23420 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
23430 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pEnd);.    }.  
23440 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
23450 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23460 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  (v);.    pLevel-
23470 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
23480 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
23490 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
234a0 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
234b0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
234c0 20 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30     if( pStart==0
234d0 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20   && pEnd==0 ){. 
234e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
234f0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
23500 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
23510 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
23520 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
23530 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
23540 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f   }.    if( testO
23550 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
23560 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
23570 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
23580 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
23590 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
235a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
235b0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
235c0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
235d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
235e0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
235f0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
23600 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
23610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23620 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d  3(v, testOp, mem
23630 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72  EndValue, addrBr
23640 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  k, iRowidReg);. 
23650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23660 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
23670 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
23680 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
23690 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  LL);.    }.  }el
236a0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
236b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
236c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
236d0 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  E|WHERE_COLUMN_E
236e0 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  Q) ){.    /* Cas
236f0 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 3: A scan usin
23700 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
23710 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
23720 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
23730 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
23740 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
23750 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
23760 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
23770 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
23780 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
23790 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
237a0 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
237b0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
237c0 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
237d0 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
237e0 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
237f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
23800 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
23810 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
23820 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23830 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
23840 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
23850 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
23860 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
23870 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
23880 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
23890 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
238a0 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
238b0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
238c0 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
238d0 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
238e0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
238f0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
23900 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
23910 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
23920 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
23930 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
23940 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
23950 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
23960 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
23970 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
23980 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
23990 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
239a0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
239b0 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
239c0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
239d0 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
239e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
239f0 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
23a00 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
23a10 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
23a20 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
23a30 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
23a40 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
23a50 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
23a60 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
23a70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23a80 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
23a90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
23aa0 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
23ab0 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
23ac0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
23ad0 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
23ae0 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
23af0 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
23b00 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
23b10 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
23b20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
23b30 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
23b40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
23b50 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
23b60 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
23b70 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
23b80 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
23b90 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
23ba0 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
23bb0 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
23bc0 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
23bd0 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
23be0 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
23bf0 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
23c00 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
23c10 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
23c20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
23c30 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
23c40 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
23c50 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
23c60 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
23c70 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
23c80 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
23c90 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
23ca0 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
23cb0 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
23cc0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
23cd0 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
23ce0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
23cf0 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20  eekGt,          
23d00 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
23d10 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
23d20 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
23d30 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
23d40 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLt,           /
23d50 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
23d60 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
23d70 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
23d80 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
23d90 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
23da0 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
23db0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
23dc0 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
23dd0 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20        OP_SeekLe 
23de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
23df0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
23e00 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
23e10 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
23e20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
23e30 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
23e40 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e  ] = {.      OP_N
23e50 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
23e60 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e   /* 0: (!end_con
23e70 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20  straints) */.   
23e80 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
23e90 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
23ea0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
23eb0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
23ec0 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20    OP_IdxLT      
23ed0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e         /* 2: (en
23ee0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
23ef0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b   bRev) */.    };
23f00 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  .    int nEq = p
23f10 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b  Level->plan.nEq;
23f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
23f30 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f  = or IN terms */
23f40 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75  .    int isMinQu
23f50 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
23f60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
23f70 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c  an optimized SEL
23f80 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a  ECT min(x).. */.
23f90 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
23fc0 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72  r holding constr
23fd0 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20  aint values */. 
23fe0 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20     int r1;      
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72  /* Temp register
24010 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
24020 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
24030 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
24040 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
24050 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
24060 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
24070 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
24080 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
24090 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
240a0 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
240b0 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
240c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
240d0 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
240e0 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
240f0 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
24100 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
24110 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24120 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
24130 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
24140 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
24150 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
24160 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
24170 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
24180 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
24190 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
241a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
241b0 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
241c0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
241d0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
241e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
241f0 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
24200 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
24210 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
24220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24230 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
24240 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
24250 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
24260 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
24270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
24280 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
24290 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
242a0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
242b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
242c0 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
242d0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
242e0 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
242f0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
24300 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
24310 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
24320 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66      char *zEndAf
24330 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
24340 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
24350 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
24360 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20  nstraint */..   
24370 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
24380 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
24390 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
243a0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
243b0 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
243c0 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20  mn[nEq];     /* 
243d0 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75  Column for inequ
243e0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
243f0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  s */..    /* If 
24400 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66  this loop satisf
24410 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72  ies a sort order
24420 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75   (pOrderBy) requ
24430 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a  est that .    **
24440 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
24450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
24460 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c  implement a "SEL
24470 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20  ECT min(x) ..." 
24480 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74  .    ** query, t
24490 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hen the caller w
244a0 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74  ill only allow t
244b0 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66  he loop to run f
244c0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  or.    ** a sing
244d0 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
244e0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
244f0 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
24500 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75  rned.    ** shou
24510 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
24520 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
24530 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
24540 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20  n 'x' is.    ** 
24550 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66  the first one af
24560 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61  ter the nEq equa
24570 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
24580 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20   in the index,. 
24590 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69     ** this requi
245a0 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c  res some special
245b0 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a   handling..    *
245c0 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c  /.    if( (wctrl
245d0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
245e0 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20  RBY_MIN)!=0.    
245f0 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   && (pLevel->pla
24600 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
24610 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26  ORDERBY).     &&
24620 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e   (pIdx->nColumn>
24630 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
24640 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72    /* assert( pOr
24650 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20  derBy->nExpr==1 
24660 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61  ); */.      /* a
24670 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
24680 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
24690 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
246a0 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a  lumn[nEq] ); */.
246b0 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79        isMinQuery
246c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
246d0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
246e0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
246f0 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
24700 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
24710 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
24720 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
24730 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
24740 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
24750 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24760 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
24770 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
24780 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  End = findTerm(p
24790 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
247a0 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f  Ready, (WO_LT|WO
247b0 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _LE), pIdx);.   
247c0 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
247d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
247e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
247f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
24800 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
24810 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69  pRangeStart = fi
24820 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
24830 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28  , k, notReady, (
24840 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49  WO_GT|WO_GE), pI
24850 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  dx);.      nExtr
24860 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
24870 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
24880 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
24890 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
248a0 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
248b0 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64  or IN.    ** and
248c0 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
248d0 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
248e0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
248f0 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
24900 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
24910 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Base..    */.   
24920 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
24930 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
24940 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
24950 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f   pLevel, pWC, no
24960 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65  tReady, nExtraRe
24970 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20  g, &zStartAff.  
24980 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66    );.    zEndAff
24990 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
249a0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  up(pParse->db, z
249b0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61  StartAff);.    a
249c0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
249d0 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f  >addrNxt;..    /
249e0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
249f0 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
24a00 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
24a10 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
24a20 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72  .    ** a forwar
24a30 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  d order scan on 
24a40 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
24a50 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20  ex, interchange 
24a60 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  the .    ** star
24a70 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
24a80 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
24a90 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
24aa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c   */.    if( nEq<
24ab0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  pIdx->nColumn &&
24ac0 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
24ad0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
24ae0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b  QLITE_SO_ASC) ){
24af0 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72  .      SWAP(Wher
24b00 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45  eTerm *, pRangeE
24b10 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  nd, pRangeStart)
24b20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
24b30 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
24b40 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
24b50 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
24b60 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_LE );.    test
24b70 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
24b80 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
24b90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24ba0 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _GE );.    testc
24bb0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
24bc0 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
24bd0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
24be0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24bf0 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
24c00 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
24c10 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
24c20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e   startEq = !pRan
24c30 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67  geStart || pRang
24c40 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
24c50 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45  r & (WO_LE|WO_GE
24c60 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20  );.    endEq =  
24c70 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
24c80 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
24c90 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
24ca0 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63  GE);.    start_c
24cb0 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61  onstraints = pRa
24cc0 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e  ngeStart || nEq>
24cd0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20  0;..    /* Seek 
24ce0 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
24cf0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
24d00 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
24d10 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
24d20 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
24d30 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20  angeStart ){.   
24d40 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
24d50 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70  = pRangeStart->p
24d60 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
24d70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24d80 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
24d90 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
24da0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
24db0 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
24dc0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
24dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
24de0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
24df0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
24e00 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  t, regBase+nEq, 
24e10 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
24e20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
24e30 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
24e40 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
24e50 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
24e60 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
24e70 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
24e80 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
24e90 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
24ea0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
24eb0 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
24ec0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
24ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
24ee0 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
24ef0 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
24f00 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
24f10 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
24f20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
24f30 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
24f40 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
24f50 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
24f60 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
24f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
24f80 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
24f90 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
24fa0 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
24fb0 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
24fc0 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
24fd0 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
24fe0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
24ff0 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
25000 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
25010 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
25020 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
25030 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
25040 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
25050 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
25060 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
25070 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
25080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
250a0 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
250b0 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  );.      nConstr
250c0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  aint++;.      st
250d0 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
250e0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
250f0 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
25100 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
25110 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
25120 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
25130 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20  , zStartAff);.  
25140 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b    op = aStartOp[
25150 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
25160 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45  ts<<2) + (startE
25170 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20  q<<1) + bRev];. 
25180 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30     assert( op!=0
25190 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
251a0 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ( op==OP_Rewind 
251b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
251c0 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a   op==OP_Last );.
251d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
251e0 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20  ==OP_SeekGt );. 
251f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25200 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20  =OP_SeekGe );.  
25210 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
25220 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
25230 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
25240 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20  P_SeekLt );.    
25250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25260 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
25270 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
25280 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
25290 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  nt);..    /* Loa
252a0 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
252b0 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
252c0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
252d0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
252e0 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
252f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
25300 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
25310 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
25320 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
25330 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
25340 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
25350 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
25360 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
25370 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
25380 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20  e+nEq, 1);.     
25390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
253a0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
253b0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
253c0 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
253d0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
253e0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
253f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25400 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
25410 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
25420 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
25430 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
25440 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
25450 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
25460 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
25470 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
25480 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
25490 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
254a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
254b0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
254c0 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
254d0 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
254e0 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
254f0 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
25500 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
25510 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
25520 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
25530 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
25540 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
25550 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
25560 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
25570 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
25580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
255a0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
255b0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
255c0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
255d0 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
255e0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
255f0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
25600 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
25610 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
25620 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
25630 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
25640 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
25650 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
25660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
25670 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
25680 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
25690 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
256a0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
256b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
256c0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
256d0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
256e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
256f0 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
25700 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
25710 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
25720 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
25730 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
25740 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
25750 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
25760 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
25770 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
25780 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
25790 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
257a0 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
257b0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
257c0 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
257d0 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
257e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
257f0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
25800 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
25810 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
25820 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
25830 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25840 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
25850 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
25860 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
25870 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
25880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25890 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
258a0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
258b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
258c0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
258d0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
258e0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
258f0 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
25900 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
25910 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
25920 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
25930 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
25940 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
25950 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
25960 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
25970 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
25980 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
25990 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
259a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
259b0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
259c0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
259d0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
259e0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
259f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
25a00 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
25a10 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
25a20 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
25a30 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
25a40 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
25a50 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T))!=0 ){.      
25a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25a70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
25a80 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
25a90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25aa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25ab0 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
25ac0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
25ad0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25ae0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
25af0 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
25b00 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
25b10 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
25b20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
25b30 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
25b40 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
25b50 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
25b60 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
25b70 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
25b80 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
25b90 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
25ba0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
25bb0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
25bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25bd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
25be0 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
25bf0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
25c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25c10 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
25c20 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
25c30 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
25c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25c50 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
25c60 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
25c70 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
25c80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
25c90 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
25ca0 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
25cb0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
25cc0 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
25cd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
25ce0 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
25cf0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
25d00 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
25d10 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
25d20 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25d30 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29  & WHERE_UNIQUE )
25d40 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
25d50 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
25d60 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
25d70 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
25d80 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a  ->op = OP_Prev;.
25d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25da0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
25db0 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _Next;.    }.   
25dc0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
25dd0 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73 65 72  dxCur;.    asser
25de0 74 28 20 28 57 48 45 52 45 5f 55 4e 51 5f 57 41  t( (WHERE_UNQ_WA
25df0 4e 54 45 44 3e 3e 33 30 29 3d 3d 31 20 29 3b 0a  NTED>>30)==1 );.
25e00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d      pLevel->p3 =
25e10 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
25e20 73 46 6c 61 67 73 3e 3e 33 30 29 26 31 3b 0a 20  sFlags>>30)&1;. 
25e30 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
25e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
25e50 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
25e60 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
25e70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
25e80 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
25e90 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f  * Case 4:  Two o
25ea0 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
25eb0 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
25ec0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
25ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
25ee0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
25ef0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
25f00 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
25f10 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
25f20 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
25f30 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
25f40 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
25f50 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
25f60 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
25f70 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
25f80 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
25f90 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
25fa0 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
25fb0 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
25fc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
25fd0 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
25fe0 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
25ff0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
26000 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
26010 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
26020 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
26030 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
26040 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
26050 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
26060 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
26070 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
26080 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
26090 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
260a0 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
260b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
260c0 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
260d0 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
260e0 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
260f0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
26100 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
26110 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
26120 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
26130 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
26140 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
26150 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
26160 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
26170 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
26180 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
26190 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
261a0 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
261b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
261c0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
261d0 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
261e0 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
261f0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
26200 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
26210 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
26220 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
26230 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
26240 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
26250 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
26260 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
26270 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
26280 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
26290 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
262a0 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
262b0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
262c0 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
262d0 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
262e0 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
262f0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
26300 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
26310 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
26330 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
26340 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
26350 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
26360 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
26370 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
26380 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
26390 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
263a0 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263c0 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
263d0 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
263e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
263f0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
26410 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
26420 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
26430 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
26440 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
26450 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
26460 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
26470 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
26480 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
26490 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
264a0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
264b0 6d 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 2f  m *pFinal;     /
264c0 2a 20 46 69 6e 61 6c 20 73 75 62 74 65 72 6d 20  * Final subterm 
264d0 77 69 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c  within the OR-cl
264e0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 53 72 63  ause. */.    Src
264f0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
26500 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
26510 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
26520 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
26530 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ion */..    int 
26540 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
26550 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
26560 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
26570 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
26580 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
26590 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265b0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
265c0 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
265d0 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
265e0 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
26610 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
26620 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
26630 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
26640 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
26650 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
26660 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
26670 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
266a0 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
266b0 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
266c0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
266d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
266e0 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
266f0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
26700 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
26710 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
26720 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
26730 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72  pTerm;.    asser
26740 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
26750 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
26760 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
26770 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
26780 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
26790 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
267a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
267b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
267c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46  Info->wc;.    pF
267d0 69 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61  inal = &pOrWc->a
267e0 5b 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d  [pOrWc->nTerm-1]
267f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
26800 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
26810 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
26820 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
26830 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
26840 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62  rcList ni pOrTab
26850 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
26860 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
26870 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
26880 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
26890 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
268a0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
268b0 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
268c0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
268d0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
268e0 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
268f0 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
26900 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
26910 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
26920 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
26930 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
26940 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
26950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
26960 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
26970 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
26980 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26990 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
269a0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
269b0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
269c0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
269d0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
269e0 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
269f0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
26a00 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
26a10 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
26a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
26a40 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
26a50 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
26a60 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
26a70 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
26a80 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
26a90 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
26aa0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31  ab->nAlloc = (i1
26ab0 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31  6)(nNotReady + 1
26ac0 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d  );.      pOrTab-
26ad0 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e  >nSrc = pOrTab->
26ae0 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65  nAlloc;.      me
26af0 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20  mcpy(pOrTab->a, 
26b00 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66  pTabItem, sizeof
26b10 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20  (*pTabItem));.  
26b20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57      origSrc = pW
26b30 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
26b40 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  a;.      for(k=1
26b50 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20  ; k<=nNotReady; 
26b60 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  k++){.        me
26b70 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b  mcpy(&pOrTab->a[
26b80 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65  k], &origSrc[pLe
26b90 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73  vel[k].iFrom], s
26ba0 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b  izeof(pOrTab->a[
26bb0 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  k]));.      }.  
26bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
26bd0 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  OrTab = pWInfo->
26be0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  pTabList;.    }.
26bf0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
26c00 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
26c10 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
26c20 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
26c30 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
26c40 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
26c50 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20  empty rowset..  
26c60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
26c70 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52   initialize regR
26c80 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e  eturn to contain
26c90 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
26ca0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
26cb0 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74  .    ** immediat
26cc0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
26cd0 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74  e OP_Return at t
26ce0 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
26cf0 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20   loop. This.    
26d00 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ** is required i
26d10 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20  n a few obscure 
26d20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20  LEFT JOIN cases 
26d30 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75  where control ju
26d40 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20  mps.    ** over 
26d50 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
26d60 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  oop into the bod
26d70 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73  y of it. In this
26d80 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
26d90 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e  * correct respon
26da0 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f  se for the end-o
26db0 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65  f-loop code (the
26dc0 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74   OP_Return) is t
26dd0 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74  o .    ** fall t
26de0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
26df0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  xt instruction, 
26e00 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65  just as an OP_Ne
26e10 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a  xt does if.    *
26e20 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75  * called on an u
26e30 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72  ninitialized cur
26e40 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
26e50 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
26e60 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
26e70 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
26e80 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
26e90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
26ea0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
26eb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
26ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26ed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
26ee0 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
26ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
26f00 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
26f10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26f20 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
26f30 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72  eturn);..    for
26f40 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
26f50 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
26f60 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
26f70 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
26f80 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
26f90 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
26fa0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
26fb0 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
26fc0 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or==WO_AND ){.  
26fd0 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
26fe0 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
26ff0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
27000 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
27010 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
27020 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
27030 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
27040 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
27050 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
27060 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
27070 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27080 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
27090 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
270a0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
270b0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
270c0 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45  _OMIT_OPEN | WHE
270d0 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a  RE_OMIT_CLOSE |.
270e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270f0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f          WHERE_FO
27100 52 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52  RCE_TABLE | WHER
27110 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
27120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
27130 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ubWInfo ){.     
27140 20 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53       explainOneS
27150 63 61 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  can(.           
27160 20 20 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61     pParse, pOrTa
27170 62 2c 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61  b, &pSubWInfo->a
27180 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65  [0], iLevel, pLe
27190 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20  vel->iFrom, 0.  
271a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
271b0 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
271c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50  lags & WHERE_DUP
271d0 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29  LICATES_OK)==0 )
271e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
271f0 74 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70  t iSet = ((ii==p
27200 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d  OrWc->nTerm-1)?-
27210 31 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20  1:ii);.         
27220 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
27230 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
27240 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
27250 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  mn(pParse, pTabI
27260 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69  tem->pTab, -1, i
27270 43 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cur, .          
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
272a0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
272b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
272c0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
272d0 5f 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67  _RowSetTest, reg
272e0 52 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Rowset,.        
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27310 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
27320 76 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a  v)+2, r, iSet);.
27330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
27360 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20  sub, regReturn, 
27370 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
27380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
27390 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
273a0 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e  dTerms flag mean
273b0 73 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74  s that this OR t
273c0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  erm.          **
273d0 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f   contained one o
273e0 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20  r more AND term 
273f0 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20  from a notReady 
27400 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20  table.  The.    
27410 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66        ** terms f
27420 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79  rom the notReady
27430 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74   table could not
27440 20 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77   be tested and w
27450 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ill.          **
27460 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74   need to be test
27470 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20  ed later..      
27480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
27490 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e   if( pSubWInfo->
274a0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20  untestedTerms ) 
274b0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
274c0 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  1;..          /*
274d0 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
274e0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
274f0 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
27500 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
27510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
27520 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
27530 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
27540 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27550 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27560 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
27570 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
27580 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
27590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
275a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
275b0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
275c0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
275d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
275e0 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
275f0 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
27600 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
27610 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
27620 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
27630 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
27640 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
27650 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
27660 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
27670 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
27680 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
27690 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
276a0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
276b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
276c0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
276d0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
276e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
276f0 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
27700 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
27710 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
27720 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
27730 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
27740 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
27750 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
27760 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
27770 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
27780 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
27790 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
277a0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
277b0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
277c0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
277d0 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c  ep[bRev];.    pL
277e0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
277f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
27800 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
27810 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
27820 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
27830 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
27840 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
27850 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
27860 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20  SCAN_STEP;.  }. 
27870 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
27880 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
27890 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f  Set, iCur);..  /
278a0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
278b0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
278c0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
278d0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
278e0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
278f0 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
27900 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
27910 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
27920 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34  ENTATION-OF: R-4
27930 39 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73  9525-50935 Terms
27940 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
27950 73 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67  satisfied throug
27960 68 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f  h.  ** the use o
27970 66 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65  f indices become
27980 20 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20   tests that are 
27990 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73  evaluated agains
279a0 74 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20  t each row of.  
279b0 2a 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  ** the relevant 
279c0 69 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20  input tables..  
279d0 2a 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f  */.  k = 0;.  fo
279e0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
279f0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
27a00 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
27a10 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
27a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
27a30 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
27a40 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
27a50 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31  * IMP: R-30575-1
27a60 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74  1662 */.    test
27a70 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
27a80 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
27a90 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
27aa0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
27ab0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
27ac0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
27ad0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
27ae0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
27af0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
27b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27b10 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
27b20 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
27b30 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
27b40 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
27b50 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
27b60 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
27b70 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
27b80 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
27b90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
27ba0 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
27bb0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
27bc0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
27bd0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
27be0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
27bf0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
27c00 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
27c10 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
27c20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
27c30 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27c40 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
27c50 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
27c60 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 6b 20 3d 20  FNULL);.    k = 
27c70 31 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  1;.    pTerm->wt
27c80 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
27c90 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  DED;.  }..  /* F
27ca0 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
27cb0 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
27cc0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
27cd0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
27ce0 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  at.  ** at least
27cf0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
27d00 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
27d10 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
27d20 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20   table.  .  */. 
27d30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
27d40 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c  ftJoin ){.    pL
27d50 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20  evel->addrFirst 
27d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
27d70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
27d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27d90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
27da0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
27db0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
27dc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
27dd0 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
27de0 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  it"));.    sqlit
27df0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
27e00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f  (pParse);.    fo
27e10 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
27e20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72  j=0; j<pWC->nTer
27e30 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
27e40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27e50 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
27e60 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
27e70 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30  );  /* IMP: R-30
27e80 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
27e90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
27ea0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
27eb0 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
27ec0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
27ed0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
27ee0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
27ef0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27f00 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
27f10 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
27f20 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ady)!=0 ){.     
27f30 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
27f40 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
27f50 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
27f60 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
27f70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
27f80 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
27f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27fa0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
27fb0 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43  rm->pExpr, addrC
27fc0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
27fd0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
27fe0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
27ff0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
28000 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
28010 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
28020 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52  Parse, iReleaseR
28030 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e  eg);..  return n
28040 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20  otReady;.}..#if 
28050 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
28060 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  EST)./*.** The f
28070 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
28080 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64  e holds a text d
28090 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75  escription of qu
280a0 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74  ery plan generat
280b0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73  ed.** by the mos
280c0 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
280d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
280e0 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c  in().  Each call
280f0 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a   to WhereBegin.*
28100 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
28110 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73   previous.  This
28120 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
28130 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
28140 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73   and.** analysis
28150 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73   only..*/.char s
28160 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
28170 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a  n[BMS*2*40];  /*
28180 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69   Text of the joi
28190 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
281a0 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20  nQPlan = 0;     
281b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
281c0 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71   free slow in _q
281d0 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a  uery_plan[] */..
281e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
281f0 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
28200 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66   Free a WhereInf
28210 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73  o structure.*/.s
28220 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
28230 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33  InfoFree(sqlite3
28240 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20   *db, WhereInfo 
28250 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20  *pWInfo){.  if( 
28260 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29  ALWAYS(pWInfo) )
28270 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
28280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
28290 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
282a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
282b0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
282c0 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
282d0 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
282e0 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
282f0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
28300 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
28310 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
28320 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28330 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ); */.        if
28340 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
28350 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
28360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28370 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
28380 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
28390 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
283a0 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
283b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
283c0 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  ( pWInfo->a[i].p
283d0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
283e0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29  ERE_TEMP_INDEX )
283f0 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  {.        Index 
28400 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e  *pIdx = pWInfo->
28410 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  a[i].plan.u.pIdx
28420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
28430 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
28440 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
28450 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29  , pIdx->zColAff)
28460 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
28470 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
28480 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dx);.        }. 
28490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
284a0 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
284b0 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a  r(pWInfo->pWC);.
284c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
284d0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
284e0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
284f0 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
28500 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
28510 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
28520 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
28530 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
28540 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
28550 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
28560 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
28570 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
28580 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
28590 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
285a0 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
285b0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
285c0 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
285d0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
285e0 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
285f0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
28600 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
28610 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
28620 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
28630 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
28640 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
28650 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
28660 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
28670 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
28680 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
28690 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
286a0 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
286b0 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
286c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
286d0 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
286e0 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
286f0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
28700 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
28710 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
28720 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
28730 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28740 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
28750 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
28760 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
28770 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
28780 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
28790 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
287a0 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
287b0 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
287c0 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
287d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
287e0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
287f0 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
28800 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
28810 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
28820 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
28830 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
28840 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
28850 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
28860 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
28870 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
28880 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
28890 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
288c0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
288d0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
288f0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
28900 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
28910 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
28920 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
28930 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
28940 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
28950 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
28960 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
28970 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
28980 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28990 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
289a0 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
289b0 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
289c0 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
289d0 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
289e0 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
289f0 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
28a00 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
28a10 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
28a20 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
28a30 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
28a40 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
28a50 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
28a60 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
28a70 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
28a80 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
28a90 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
28aa0 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
28ab0 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
28ac0 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
28ad0 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
28ae0 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
28af0 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
28b00 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
28b10 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
28b20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
28b30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
28b40 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
28b50 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
28b60 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
28b70 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
28b80 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
28b90 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
28ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
28bb0 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
28bc0 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
28bd0 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
28be0 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
28bf0 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
28c00 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
28c10 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
28c20 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
28c30 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
28c40 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
28c50 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
28c60 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
28c70 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
28c80 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
28c90 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
28ca0 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
28cb0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28cc0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
28cd0 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
28ce0 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
28cf0 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
28d00 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
28d10 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
28d20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
28d30 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
28d40 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
28d50 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
28d60 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
28d70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
28d80 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
28d90 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
28da0 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
28db0 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
28dc0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
28dd0 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
28de0 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
28df0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
28e00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
28e10 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
28e20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
28e30 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
28e40 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
28e50 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
28e60 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
28e70 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
28e80 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
28e90 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
28ea0 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
28eb0 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
28ec0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
28ed0 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
28ee0 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
28ef0 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
28f00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
28f10 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
28f20 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
28f30 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
28f40 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
28f50 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
28f60 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
28f70 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
28f80 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
28f90 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
28fa0 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
28fb0 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
28fc0 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
28fd0 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
28fe0 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
28ff0 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
29000 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
29010 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
29020 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
29030 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
29040 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
29050 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
29060 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
29070 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
29080 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
29090 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
290a0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
290b0 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
290c0 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
290d0 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
290e0 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
290f0 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
29100 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
29110 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
29120 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
29130 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
29140 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
29150 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64  ING.**.** *ppOrd
29160 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65  erBy is a pointe
29170 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  r to the ORDER B
29180 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  Y clause of a SE
29190 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
291a0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
291b0 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
291c0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
291d0 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
291e0 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
291f0 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
29200 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
29210 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f  tement, then ppO
29220 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a  rderBy is NULL..
29230 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65  **.** If an inde
29240 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f  x can be used so
29250 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61   that the natura
29260 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f  l output order o
29270 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73  f the table.** s
29280 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66  can is correct f
29290 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
292a0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61  clause, then tha
292b0 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20  t index is used 
292c0 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  and.** *ppOrderB
292d0 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  y is set to NULL
292e0 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
292f0 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
29300 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75  prevents an.** u
29310 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20  nnecessary sort 
29320 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
29330 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70  t if an index ap
29340 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
29350 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
29360 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69  ause already exi
29370 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sts..**.** If th
29380 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c  e where clause l
29390 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61  oops cannot be a
293a0 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69  rranged to provi
293b0 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  de the correct.*
293c0 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20  * output order, 
293d0 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65  then the *ppOrde
293e0 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64  rBy is unchanged
293f0 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a  ..*/.WhereInfo *
29400 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29410 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
29420 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  se,        /* Th
29430 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
29440 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
29450 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41  TabList,    /* A
29460 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62   list of all tab
29470 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65  les to be scanne
29480 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
29490 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
294a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
294b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
294c0 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41  *ppOrderBy, /* A
294d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
294e0 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
294f0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
29500 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
29510 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67  the WHERE_* flag
29520 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
29530 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20  iteInt.h */.){. 
29540 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
29550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29560 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29570 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
29580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29590 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
295a0 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
295b0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
295c0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
295d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
295e0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
295f0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
29600 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
29610 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
29620 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
29630 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
29640 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
29650 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
29660 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
29670 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
29680 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
29690 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
296a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
296b0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
296c0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
296d0 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
296e0 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
296f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
29700 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
29710 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
29720 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  WC;             
29730 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
29740 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  on of the WHERE 
29750 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
29760 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29770 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41  *pTabItem;  /* A
29780 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72   single entry fr
29790 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  om pTabList */. 
297a0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
297b0 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
297c0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
297d0 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f  el in the pWInfo
297e0 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
297f0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
29800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29810 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
29820 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
29830 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
29840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29850 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
29860 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d  tion of all pWC-
29870 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a  >a[].wtFlags */.
29880 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
298a0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
298b0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ion */..  /* The
298c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
298d0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
298e0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
298f0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
29900 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
29910 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
29920 74 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69  testcase( pTabLi
29930 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b  st->nSrc==BMS );
29940 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
29950 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
29960 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
29970 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
29980 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
29990 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
299a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
299b0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
299c0 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e  ion normally gen
299d0 65 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20  erates a nested 
299e0 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62  loop for all tab
299f0 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61  les in .  ** pTa
29a00 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74  bList.  But if t
29a10 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  he WHERE_ONETABL
29a20 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
29a30 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75  et, then we shou
29a40 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e  ld.  ** only gen
29a50 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
29a60 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  he first table i
29a70 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  n pTabList and a
29a80 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20  ssume that.  ** 
29a90 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f  any cursors asso
29aa0 63 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73  ciated with subs
29ab0 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72  equent tables ar
29ac0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
29ad0 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74  .  */.  nTabList
29ae0 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26   = (wctrlFlags &
29af0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
29b00 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62  ONLY) ? 1 : pTab
29b10 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
29b20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
29b30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
29b40 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
29b50 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
29b60 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
29b70 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
29b80 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
29b90 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
29ba0 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
29bb0 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
29bc0 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
29bd0 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
29be0 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
29bf0 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
29c00 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
29c10 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
29c20 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
29c30 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
29c40 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
29c50 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
29c60 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
29c70 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
29c80 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
29c90 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
29ca0 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
29cb0 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  elow..  */.  db 
29cc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
29cd0 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
29ce0 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
29cf0 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
29d00 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
29d10 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
29d20 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
29d30 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
29d40 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a    nByteWInfo + .
29d50 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
29d60 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20  reClause) +.    
29d70 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61    sizeof(WhereMa
29d80 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66  skSet).  );.  if
29d90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29da0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
29db0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
29dc0 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
29dd0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
29de0 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
29df0 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   }.  pWInfo->nLe
29e00 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a  vel = nTabList;.
29e10 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
29e20 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
29e30 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
29e40 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
29e50 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
29e60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
29e70 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
29e80 70 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65  pWC = pWC = (Whe
29e90 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38  reClause *)&((u8
29ea0 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65   *)pWInfo)[nByte
29eb0 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f  WInfo];.  pWInfo
29ec0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
29ed0 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49  ctrlFlags;.  pWI
29ee0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
29ef0 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
29f00 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61  QueryLoop;.  pMa
29f10 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61  skSet = (WhereMa
29f20 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a  skSet*)&pWC[1];.
29f30 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
29f40 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
29f50 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
29f60 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
29f70 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
29f80 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
29f90 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
29fa0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
29fb0 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
29fc0 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
29fd0 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50  auseInit(pWC, pP
29fe0 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
29ff0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
2a000 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  deConstants(pPar
2a010 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77  se, pWhere);.  w
2a020 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
2a030 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20  Where, TK_AND); 
2a040 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34    /* IMP: R-1584
2a050 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a  2-53296 */.    .
2a060 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
2a070 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
2a080 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
2a090 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
2a0a0 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
2a0b0 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
2a0c0 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
2a0d0 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
2a0e0 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
2a0f0 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c  pWhere && (nTabL
2a100 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
2a110 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
2a120 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20  otJoin(pWhere)) 
2a130 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2a140 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2a150 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
2a160 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  ->iBreak, SQLITE
2a170 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2a180 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
2a190 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
2a1a0 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
2a1b0 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
2a1c0 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
2a1d0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2a1e0 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
2a1f0 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
2a200 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
2a210 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
2a220 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
2a230 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
2a240 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
2a250 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
2a260 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
2a270 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
2a280 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
2a290 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
2a2a0 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
2a2b0 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
2a2c0 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
2a2d0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
2a2e0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2a2f0 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
2a300 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
2a310 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
2a320 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
2a330 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
2a340 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
2a350 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
2a360 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
2a370 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2a380 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
2a390 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
2a3a0 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2a3b0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
2a3c0 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
2a3d0 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
2a3e0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2a3f0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2a400 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
2a410 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2a420 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
2a430 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57   Configure the W
2a440 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b  hereClause.vmask
2a450 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61   variable so tha
2a460 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72 72  t bits that corr
2a470 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76  espond.  ** to v
2a480 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
2a490 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54 68  sors are set. Th
2a4a0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  is is used to se
2a4b0 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c  lectively disabl
2a4c0 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74  e .  ** the OR-t
2a4d0 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74  o-IN transformat
2a4e0 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79  ion in exprAnaly
2a4f0 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69  zeOrTerm(). It i
2a500 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20  s not helpful . 
2a510 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c   ** with virtual
2a520 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
2a530 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
2a540 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
2a550 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
2a560 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
2a570 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
2a580 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
2a590 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
2a5a0 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
2a5b0 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
2a5c0 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
2a5d0 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
2a5e0 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
2a5f0 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
2a600 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2a610 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2a620 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a630 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26   pWC->vmask==0 &
2a640 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30  & pMaskSet->n==0
2a650 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2a660 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a670 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74   i++){.    creat
2a680 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
2a690 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
2a6a0 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66  Cursor);.#ifndef
2a6b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2a6c0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2a6d0 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73  ( ALWAYS(pTabLis
2a6e0 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26  t->a[i].pTab) &&
2a6f0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c   IsVirtual(pTabL
2a700 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20  ist->a[i].pTab) 
2a710 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d  ){.      pWC->vm
2a720 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  ask |= ((Bitmask
2a730 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a  )1 << i);.    }.
2a740 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64  #endif.  }.#ifnd
2a750 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
2a760 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
2a770 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
2a780 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
2a790 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
2a7a0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
2a7b0 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2a7c0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
2a7d0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
2a7e0 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
2a7f0 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
2a800 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
2a810 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
2a820 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
2a830 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
2a840 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
2a850 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
2a860 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
2a870 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
2a880 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
2a890 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2a8a0 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
2a8b0 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
2a8c0 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
2a8d0 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
2a8e0 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
2a8f0 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
2a900 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
2a910 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
2a920 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
2a930 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
2a940 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
2a950 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
2a960 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69  bList, pWC);.  i
2a970 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2a980 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2a990 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2a9a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
2a9b0 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
2a9c0 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
2a9d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2a9e0 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2a9f0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
2aa00 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
2aa10 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
2aa20 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
2aa30 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
2aa40 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
2aa50 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
2aa60 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
2aa70 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77     pWInfo->a[].w
2aa80 73 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78  sFlags   WHERE_x
2aa90 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
2aaa0 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
2aab0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
2aac0 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
2aad0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
2aae0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
2aaf0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2ab00 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63  ].iFrom     Whic
2ab10 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  h term of the FR
2ab20 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69  OM clause is bei
2ab30 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20  ng coded.  **   
2ab40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62  pWInfo->a[].iTab
2ab50 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63  Cur   The VDBE c
2ab60 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
2ab70 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a  tabase table.  *
2ab80 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2ab90 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44  iIdxCur   The VD
2aba0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
2abb0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70  e index.  **   p
2abc0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d  WInfo->a[].pTerm
2abd0 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67       When wsFlag
2abe0 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52  s==WO_OR, the OR
2abf0 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a  -clause term.  *
2ac00 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2ac10 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
2ac20 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
2ac30 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
2ac40 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
2ac50 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
2ac60 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
2ac70 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
2ac80 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
2ac90 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
2aca0 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
2acb0 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52   = ~0;.  WHERETR
2acc0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
2acd0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
2ace0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f  ));.  for(i=iFro
2acf0 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  m=0, pLevel=pWIn
2ad00 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73  fo->a; i<nTabLis
2ad10 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  t; i++, pLevel++
2ad20 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74  ){.    WhereCost
2ad30 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20   bestPlan;      
2ad40 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63     /* Most effic
2ad50 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73  ient plan seen s
2ad60 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64  o far */.    Ind
2ad70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
2ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ad90 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
2ada0 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
2adb0 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2ade0 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20  ver FROM tables 
2adf0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a  */.    int bestJ
2ae00 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
2ae10 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
2ae20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d  of j */.    Bitm
2ae30 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20  ask m;          
2ae40 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
2ae50 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f  sk value for j o
2ae60 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69  r bestJ */.    i
2ae70 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20  nt isOptimal;   
2ae80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2ae90 65 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d  erator for optim
2aea0 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73  al/non-optimal s
2aeb0 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74  earch */.    int
2aec0 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b   nUnconstrained;
2aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2aee0 65 72 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75  er tables withou
2aef0 74 20 49 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a  t INDEXED BY */.
2af00 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49      Bitmask notI
2af10 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20  ndexed;         
2af20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65  /* Mask of table
2af30 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73  s that cannot us
2af40 65 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  e an index */.. 
2af50 20 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50     memset(&bestP
2af60 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  lan, 0, sizeof(b
2af70 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62  estPlan));.    b
2af80 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20  estPlan.rCost = 
2af90 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
2afa0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
2afb0 22 2a 2a 2a 20 42 65 67 69 6e 20 73 65 61 72 63  "*** Begin searc
2afc0 68 20 66 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a  h for loop %d **
2afd0 2a 5c 6e 22 2c 20 69 29 29 3b 0a 0a 20 20 20 20  *\n", i));..    
2afe0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
2aff0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e  the remaining en
2b000 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  tries in the FRO
2b010 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64  M clause to find
2b020 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
2b030 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68   nested loop. Th
2b040 65 20 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c  e loop tests all
2b050 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
2b060 72 69 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68  ries.    ** eith
2b070 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65  er once or twice
2b080 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
2b090 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20   The first test 
2b0a0 69 73 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72  is always perfor
2b0b0 6d 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  med if there are
2b0c0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74   two or more ent
2b0d0 72 69 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61  ries.    ** rema
2b0e0 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20  ining and never 
2b0f0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
2b100 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46  re is only one F
2b110 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
2b120 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73  .    ** to choos
2b130 65 20 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72  e from.  The fir
2b140 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f  st test looks fo
2b150 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73  r an "optimal" s
2b160 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20  can.  In.    ** 
2b170 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20  this context an 
2b180 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20  optimal scan is 
2b190 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74 68  one that uses th
2b1a0 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a  e same strategy.
2b1b0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67      ** for the g
2b1c0 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  iven FROM clause
2b1d0 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20   entry as would 
2b1e0 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20 74  be selected if t
2b1f0 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  he entry.    ** 
2b200 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68 65  were used as the
2b210 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65   innermost neste
2b220 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65  d loop.  In othe
2b230 72 20 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65  r words, a table
2b240 0a 20 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65  .    ** is chose
2b250 6e 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  n such that the 
2b260 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20  cost of running 
2b270 74 68 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f  that table canno
2b280 74 20 62 65 20 72 65 64 75 63 65 64 0a 20 20 20  t be reduced.   
2b290 20 2a 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66   ** by waiting f
2b2a0 6f 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  or other tables 
2b2b0 74 6f 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54  to run first.  T
2b2c0 68 69 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65  his "optimal" te
2b2d0 73 74 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20  st works.    ** 
2b2e0 62 79 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e  by first assumin
2b2f0 67 20 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20  g that the FROM 
2b300 63 6c 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65  clause is on the
2b310 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20   inner loop and 
2b320 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69  finding.    ** i
2b330 74 73 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74  ts query plan, t
2b340 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  hen checking to 
2b350 73 65 65 20 69 66 20 74 68 61 74 20 71 75 65 72  see if that quer
2b360 79 20 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a  y plan uses any.
2b370 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f      ** other FRO
2b380 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
2b390 68 61 74 20 61 72 65 20 6e 6f 74 52 65 61 64 79  hat are notReady
2b3a0 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64  .  If no notRead
2b3b0 79 20 74 65 72 6d 73 20 61 72 65 0a 20 20 20 20  y terms are.    
2b3c0 2a 2a 20 75 73 65 64 20 74 68 65 6e 20 74 68 65  ** used then the
2b3d0 20 22 6f 70 74 69 6d 61 6c 22 20 71 75 65 72 79   "optimal" query
2b3e0 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20   plan works..   
2b3f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2b400 74 68 61 74 20 74 68 65 20 57 68 65 72 65 43 6f  that the WhereCo
2b410 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d 65 74 65  st.nRow paramete
2b420 72 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c  r for an optimal
2b430 20 73 63 61 6e 20 6d 69 67 68 74 0a 20 20 20 20   scan might.    
2b440 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20 73 6d 61  ** not be as sma
2b450 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62  ll as it would b
2b460 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 72  e if the table r
2b470 65 61 6c 6c 79 20 77 65 72 65 20 74 68 65 20 69  eally were the i
2b480 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20  nnermost.    ** 
2b490 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20  join.  The nRow 
2b4a0 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 64  value can be red
2b4b0 75 63 65 64 20 62 79 20 57 48 45 52 45 20 63 6c  uced by WHERE cl
2b4c0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
2b4d0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20  .    ** that do 
2b4e0 6e 6f 74 20 75 73 65 20 69 6e 64 69 63 65 73 2e  not use indices.
2b4f0 20 20 42 75 74 20 74 68 69 73 20 6e 52 6f 77 20    But this nRow 
2b500 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68  reduction only h
2b510 61 70 70 65 6e 73 20 69 66 20 74 68 65 0a 20 20  appens if the.  
2b520 20 20 2a 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c    ** table reall
2b530 79 20 69 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f  y is the innermo
2b540 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a  st join.  .    *
2b550 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
2b560 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ond loop iterati
2b570 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f  on is only perfo
2b580 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d  rmed if no optim
2b590 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73  al scan.    ** s
2b5a0 74 72 61 74 65 67 69 65 73 20 77 65 72 65 20 66  trategies were f
2b5b0 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69 72 73  ound by the firs
2b5c0 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  t iteration. Thi
2b5d0 73 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  s second iterati
2b5e0 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 75 73 65  on.    ** is use
2b5f0 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  d to search for 
2b600 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2b610 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20  scan overall..  
2b620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76    **.    ** Prev
2b630 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
2b640 20 53 51 4c 69 74 65 20 70 65 72 66 6f 72 6d 65   SQLite performe
2b650 64 20 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e  d only the secon
2b660 64 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20  d iteration -.  
2b670 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f 75    ** the next ou
2b680 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73  termost loop was
2b690 20 61 6c 77 61 79 73 20 74 68 61 74 20 77 69 74   always that wit
2b6a0 68 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 76 65  h the lowest ove
2b6b0 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74  rall.    ** cost
2b6c0 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20  . However, this 
2b6d0 6d 65 61 6e 74 20 74 68 61 74 20 53 51 4c 69 74  meant that SQLit
2b6e0 65 20 63 6f 75 6c 64 20 73 65 6c 65 63 74 20 74  e could select t
2b6f0 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20  he wrong plan.  
2b700 20 20 2a 2a 20 66 6f 72 20 73 63 72 69 70 74 73    ** for scripts
2b710 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
2b720 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20  lowing:.    **  
2b730 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54   .    **   CREAT
2b740 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
2b750 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  ; .    **   CREA
2b760 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64  TE TABLE t2(c, d
2b770 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  );.    **   SELE
2b780 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31  CT * FROM t2, t1
2b790 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64 20   WHERE t2.rowid 
2b7a0 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20  = t1.a;.    **. 
2b7b0 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20 73     ** The best s
2b7c0 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 69 74  trategy is to it
2b7d0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
2b7e0 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48 6f  ble t1 first. Ho
2b7f0 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a 20  wever it.    ** 
2b800 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
2b810 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  to determine thi
2b820 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65 20  s with a simple 
2b830 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68 6d  greedy algorithm
2b840 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63 65 20 74  ..    ** Since t
2b850 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e  he cost of a lin
2b860 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
2b870 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68 65   table t2 is the
2b880 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73   same .    ** as
2b890 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c   the cost of a l
2b8a0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2b8b0 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73  gh table t1, a s
2b8c0 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20  imple greedy .  
2b8d0 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d    ** algorithm m
2b8e0 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65  ay choose to use
2b8f0 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65   t2 for the oute
2b900 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73  r loop, which is
2b910 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63   a much.    ** c
2b920 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68  ostlier approach
2b930 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e  ..    */.    nUn
2b940 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30 3b  constrained = 0;
2b950 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20  .    notIndexed 
2b960 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f  = 0;.    for(isO
2b970 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54  ptimal=(iFrom<nT
2b980 61 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70 74  abList-1); isOpt
2b990 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a  imal>=0 && bestJ
2b9a0 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29  <0; isOptimal--)
2b9b0 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2b9c0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
2b9d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62    /* Mask of tab
2b9e0 6c 65 73 20 6e 6f 74 20 79 65 74 20 72 65 61 64  les not yet read
2b9f0 79 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  y */.      for(j
2ba00 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d  =iFrom, pTabItem
2ba10 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
2ba20 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b  ; j<nTabList; j+
2ba30 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
2ba40 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f          int doNo
2ba50 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20  tReorder;    /* 
2ba60 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62  True if this tab
2ba70 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  le should not be
2ba80 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
2ba90 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
2baa0 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f  sCost;     /* Co
2bab0 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  st information f
2bac0 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c  rom best[Virtual
2bad0 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20  ]Index() */.    
2bae0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
2baf0 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45  rderBy;  /* ORDE
2bb00 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
2bb10 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a  index to optimiz
2bb20 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20  e */.  .        
2bb30 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20  doNotReorder =  
2bb40 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
2bb50 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
2bb60 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20  T_CROSS))!=0;.  
2bb70 20 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72        if( j!=iFr
2bb80 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64  om && doNotReord
2bb90 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
2bba0 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28      m = getMask(
2bbb0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  pMaskSet, pTabIt
2bbc0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2bbd0 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
2bbe0 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
2bbf0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
2bc00 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
2bc10 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
2bc20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
2bc30 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 28 69         mask = (i
2bc40 73 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e  sOptimal ? m : n
2bc50 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20  otReady);.      
2bc60 20 20 70 4f 72 64 65 72 42 79 20 3d 20 28 28 69    pOrderBy = ((i
2bc70 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  ==0 && ppOrderBy
2bc80 20 29 3f 2a 70 70 4f 72 64 65 72 42 79 3a 30 29   )?*ppOrderBy:0)
2bc90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
2bca0 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d  abItem->pIndex==
2bcb0 30 20 29 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e  0 ) nUnconstrain
2bcc0 65 64 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20  ed++;.  .       
2bcd0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d   WHERETRACE(("==
2bce0 3d 20 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25  = trying table %
2bcf0 64 20 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c  d with isOptimal
2bd00 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20  =%d ===\n",.    
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd20 6a 2c 20 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a  j, isOptimal));.
2bd30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bd40 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
2bd50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2bd60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2bd70 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  LE.        if( I
2bd80 73 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65  sVirtual(pTabIte
2bd90 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
2bda0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2bdb0 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20  dex_info **pp = 
2bdc0 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49  &pWInfo->a[j].pI
2bdd0 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  dxInfo;.        
2bde0 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
2bdf0 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
2be00 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20  pTabItem, mask, 
2be10 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72  notReady, pOrder
2be20 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2be40 73 43 6f 73 74 2c 20 70 70 29 3b 0a 20 20 20 20  sCost, pp);.    
2be50 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
2be60 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
2be70 20 20 20 20 20 20 62 65 73 74 42 74 72 65 65 49        bestBtreeI
2be80 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
2be90 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b  , pTabItem, mask
2bea0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
2beb0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2bed0 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  sCost);.        
2bee0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2bef0 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28  ( isOptimal || (
2bf00 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65  sCost.used&notRe
2bf10 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ady)==0 );..    
2bf20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44      /* If an IND
2bf30 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69  EXED BY clause i
2bf40 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
2bf50 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20 75 73  the plan must us
2bf60 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2bf70 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20 75 73  * index if it us
2bf80 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61 74 20  es any index at 
2bf90 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  all */.        a
2bfa0 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
2bfb0 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20  >pIndex==0 .    
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2bfd0 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46   (sCost.plan.wsF
2bfe0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2bff0 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20  _FULLSCAN)==0.  
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c010 7c 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e  || sCost.plan.u.
2c020 70 49 64 78 3d 3d 70 54 61 62 49 74 65 6d 2d 3e  pIdx==pTabItem->
2c030 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20 20  pIndex );..     
2c040 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c     if( isOptimal
2c050 20 26 26 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e   && (sCost.plan.
2c060 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c070 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2c080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
2c090 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20  tIndexed |= m;. 
2c0a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c0b0 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20    /* Conditions 
2c0c0 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73  under which this
2c0d0 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74   table becomes t
2c0e0 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a  he best so far:.
2c0f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c100 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20     **   (1) The 
2c110 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64  table must not d
2c120 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74  epend on other t
2c130 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  ables that have 
2c140 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  not.        **  
2c150 20 20 20 20 20 79 65 74 20 72 75 6e 2e 0a 20 20       yet run..  
2c160 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c170 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c 6c   **   (2) A full
2c180 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61 6e  -table-scan plan
2c190 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65 64   cannot superced
2c1a0 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20 75  e indexed plan u
2c1b0 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a 2a  nless.        **
2c1c0 20 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c 2d         the full-
2c1d0 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61 6e  table-scan is an
2c1e0 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e 20   "optimal" plan 
2c1f0 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  as defined above
2c200 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2c210 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c       **   (3) Al
2c220 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e  l tables have an
2c230 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2c240 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
2c250 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20   lacks an.      
2c260 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58    **       INDEX
2c270 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
2c280 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20  this table uses 
2c290 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20  the specific.   
2c2a0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
2c2b0 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79  dex specified by
2c2c0 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20   its INDEXED BY 
2c2d0 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75  clause.  This ru
2c2e0 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20  le ensures.     
2c2f0 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74     **       that
2c300 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69   a best-so-far i
2c310 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65  s always selecte
2c320 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70  d even if an imp
2c330 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
2c340 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61  **       combina
2c350 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20  tion of INDEXED 
2c360 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67  BY clauses are g
2c370 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  iven.  The error
2c380 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2c390 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74    will be detect
2c3a0 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62  ed and relayed b
2c3b0 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ack to the appli
2c3c0 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20  cation later..  
2c3d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54        **       T
2c3e0 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73  he NEVER() comes
2c3f0 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72   about because r
2c400 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72  ule (2) above pr
2c410 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
2c420 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78  *       An index
2c430 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  able full-table-
2c440 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69  scan from reachi
2c450 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20  ng rule (3)..   
2c460 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c470 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61  **   (4) The pla
2c480 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c  n cost must be l
2c490 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20  ower than prior 
2c4a0 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20 74 68  plans or else th
2c4b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
2c4c0 20 20 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20     cost must be 
2c4d0 74 68 65 20 73 61 6d 65 20 61 6e 64 20 74 68 65  the same and the
2c4e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2c4f0 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 2e 0a 20  must be lower.. 
2c500 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c510 20 20 69 66 28 20 28 73 43 6f 73 74 2e 75 73 65    if( (sCost.use
2c520 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 20  d&notReady)==0  
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c540 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
2c550 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62             && (b
2c560 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e  estJ<0 || (notIn
2c570 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20  dexed&m)!=0     
2c580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
2c590 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c5a0 20 20 20 20 7c 7c 20 28 62 65 73 74 50 6c 61 6e      || (bestPlan
2c5b0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2c5c0 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2c5d0 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  AN)==0.         
2c5e0 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74         || (sCost
2c5f0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2c600 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2c610 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20 20  AN)!=0).        
2c620 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74      && (nUnconst
2c630 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54 61  rained==0 || pTa
2c640 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30  bItem->pIndex==0
2c650 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2c670 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c 61  NEVER((sCost.pla
2c680 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2c690 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21  E_NOT_FULLSCAN)!
2c6a0 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  =0)).           
2c6b0 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20   && (bestJ<0 || 
2c6c0 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74  sCost.rCost<best
2c6d0 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20 20  Plan.rCost      
2c6e0 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
2c6f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
2c700 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50  ost.rCost<=bestP
2c710 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20  lan.rCost .     
2c720 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
2c730 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 62  Cost.plan.nRow<b
2c740 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
2c750 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  w)).        ){. 
2c760 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
2c770 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65 20  ACE(("=== table 
2c780 25 64 20 69 73 20 62 65 73 74 20 73 6f 20 66 61  %d is best so fa
2c790 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2c7a0 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2c7b0 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77  cost=%g and nRow
2c7c0 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2c7e0 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43   sCost.rCost, sC
2c7f0 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b  ost.plan.nRow));
2c800 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50  .          bestP
2c810 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20  lan = sCost;.   
2c820 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
2c830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c840 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f      if( doNotReo
2c850 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
2c860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c870 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30  assert( bestJ>=0
2c880 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c890 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d 61  notReady & getMa
2c8a0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2c8b0 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
2c8c0 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  iCursor) );.    
2c8d0 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2c8e0 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
2c8f0 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20  ts table %d for 
2c900 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20 20  loop %d".       
2c910 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2c920 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77  cost=%g and nRow
2c930 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
2c940 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70          bestJ, p
2c950 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c  Level-pWInfo->a,
2c960 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c   bestPlan.rCost,
2c970 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
2c980 52 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 28  Row));.    if( (
2c990 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2c9a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2c9b0 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20  DERBY)!=0 ){.   
2c9c0 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
2c9d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64  0;.    }.    and
2c9e0 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61  Flags &= bestPla
2c9f0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  n.plan.wsFlags;.
2ca00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e      pLevel->plan
2ca10 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e   = bestPlan.plan
2ca20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2ca30 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2ca40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2ca50 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73  DEXED );.    tes
2ca60 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e  tcase( bestPlan.
2ca70 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2ca80 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
2ca90 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74 50  );.    if( bestP
2caa0 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2cab0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
2cac0 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  D|WHERE_TEMP_IND
2cad0 45 58 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  EX) ){.      pLe
2cae0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
2caf0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2cb00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cb10 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
2cb20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2cb30 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
2cb40 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2cb50 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
2cb60 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2cb70 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
2cb80 28 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69  (u8)bestJ;.    i
2cb90 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  f( bestPlan.plan
2cba0 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31  .nRow>=(double)1
2cbb0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
2cbc0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20  ->nQueryLoop *= 
2cbd0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2cbe0 6f 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ow;.    }..    /
2cbf0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20  * Check that if 
2cc00 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65  the table scanne
2cc10 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  d by this loop i
2cc20 74 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a  teration had an.
2cc30 20 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42      ** INDEXED B
2cc40 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65  Y clause attache
2cc50 64 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68  d to it, that th
2cc60 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73  e named index is
2cc70 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73   being.    ** us
2cc80 65 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e  ed for the scan.
2cc90 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75   If not, then qu
2cca0 65 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ery compilation 
2ccb0 68 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  has failed..    
2ccc0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
2ccd0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  or..    */.    p
2cce0 49 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Idx = pTabList->
2ccf0 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b  a[bestJ].pIndex;
2cd00 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
2cd10 0a 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74  .      if( (best
2cd20 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2cd30 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2cd40 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)==0 ){.       
2cd50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2cd60 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
2cd70 20 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c   use index: %s",
2cd80 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
2cd90 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
2cda0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
2cdb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cdc0 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58    /* If an INDEX
2cdd0 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
2cde0 75 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e  used, the bestIn
2cdf0 64 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  dex() function i
2ce00 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61  s.        ** gua
2ce10 72 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20  ranteed to find 
2ce20 74 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66  the index specif
2ce30 69 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58  ied in the INDEX
2ce40 45 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ED BY clause.   
2ce50 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69       ** if it fi
2ce60 6e 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61  nd an index at a
2ce70 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
2ce80 73 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e  ssert( bestPlan.
2ce90 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64  plan.u.pIdx==pId
2cea0 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x );.      }.   
2ceb0 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
2cec0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
2ced0 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
2cee0 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61  \n"));.  if( pPa
2cef0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
2cf00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2cf10 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2cf20 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
2cf30 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
2cf40 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
2cf50 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
2cf60 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
2cf70 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
2cf80 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
2cf90 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
2cfa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2cfb0 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
2cfc0 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
2cfd0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
2cfe0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
2cff0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
2d000 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
2d010 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
2d020 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
2d030 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
2d040 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
2d050 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
2d060 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
2d070 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
2d080 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
2d090 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
2d0a0 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
2d0b0 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
2d0c0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
2d0d0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
2d0e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
2d0f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2d100 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2d110 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
2d120 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
2d130 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
2d140 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2d150 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
2d160 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
2d170 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
2d180 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
2d190 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
2d1a0 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
2d1b0 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
2d1c0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
2d1d0 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
2d1e0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
2d1f0 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
2d200 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
2d210 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
2d220 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
2d230 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
2d240 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2d250 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
2d260 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
2d270 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
2d280 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2d290 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49  Bitmask)0;.  pWI
2d2a0 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28  nfo->nRowOut = (
2d2b0 64 6f 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28  double)1;.  for(
2d2c0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2d2d0 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73  fo->a; i<nTabLis
2d2e0 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  t; i++, pLevel++
2d2f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2d300 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
2d310 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
2d320 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2d330 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
2d340 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2d350 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
2d360 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
2d370 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
2d380 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
2d390 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d   pTab = pTabItem
2d3a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->pTab;.    pLev
2d3b0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
2d3c0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2d3d0 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
2d3e0 77 4f 75 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e  wOut *= pLevel->
2d3f0 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69  plan.nRow;.    i
2d400 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2d410 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
2d420 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
2d430 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2d440 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2d450 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
2d460 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2d470 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
2d480 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69   */.    }else.#i
2d490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d4a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2d4b0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2d4c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d4d0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2d4e0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  E)!=0 ){.      c
2d4f0 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
2d500 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2d510 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
2d520 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
2d530 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54     int iCur = pT
2d540 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
2d550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d560 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
2d570 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30  Open, iCur, 0, 0
2d580 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  , pVTab, P4_VTAB
2d590 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
2d5a0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
2d5b0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2d5c0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2d5d0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2d5e0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2d5f0 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e   WHERE_OMIT_OPEN
2d600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2d610 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
2d620 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
2d630 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
2d640 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
2d650 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
2d660 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
2d670 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
2d680 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74  ab, op);.      t
2d690 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
2d6a0 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
2d6b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2d6c0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b  ab->nCol==BMS );
2d6d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e  .      if( !pWIn
2d6e0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26  fo->okOnePass &&
2d6f0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
2d700 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2d710 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2d720 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2d730 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2d740 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2d750 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2d760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d770 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69  ChangeP4(v, sqli
2d780 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2d790 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20  dr(v)-1, .      
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54        SQLITE_INT
2d7c0 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49  _TO_PTR(n), P4_I
2d7d0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61  NT32);.        a
2d7e0 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
2d7f0 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
2d800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d810 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2d820 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2d830 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2d840 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2d850 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2d860 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2d870 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
2d880 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2d890 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
2d8a0 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
2d8b0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74      constructAut
2d8c0 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61 72  omaticIndex(pPar
2d8d0 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
2d8e0 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  m, notReady, pLe
2d8f0 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  vel);.    }else.
2d900 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
2d910 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2d920 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2d930 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
2d940 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70    Index *pIx = p
2d950 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2d960 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  dx;.      KeyInf
2d970 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
2d980 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
2d990 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
2d9a0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
2d9b0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
2d9c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d9d0 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
2d9e0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
2d9f0 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64 78      assert( iIdx
2da00 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Cur>=0 );.      
2da10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2da20 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
2da30 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
2da40 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da60 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
2da70 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
2da80 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
2da90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2daa0 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
2dab0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2dac0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
2dad0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2dae0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
2daf0 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
2db00 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
2db10 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >iCursor);.  }. 
2db20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
2db30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2db40 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
2db50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2db60 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2db70 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
2db80 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
2db90 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
2dba0 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
2dbb0 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
2dbc0 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
2dbd0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
2dbe0 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
2dbf0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
2dc00 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
2dc10 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2dc20 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2dc30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c  for(i=0; i<nTabL
2dc40 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ist; i++){.    p
2dc50 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
2dc60 3e 61 5b 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61  >a[i];.    expla
2dc70 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65  inOneScan(pParse
2dc80 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
2dc90 65 6c 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  el, i, pLevel->i
2dca0 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73  From, wctrlFlags
2dcb0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2dcc0 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
2dcd0 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63  rt(pWInfo, i, wc
2dce0 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61  trlFlags, notRea
2dcf0 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
2dd00 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
2dd10 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
2dd20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
2dd30 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74  E_TEST  /* For t
2dd40 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
2dd50 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
2dd60 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20  .  /* Record in 
2dd70 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  the query plan i
2dd80 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
2dd90 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
2dda0 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  le.  ** and the 
2ddb0 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63  index used to ac
2ddc0 63 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29  cess it (if any)
2ddd0 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
2dde0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e  itself.  ** is n
2ddf0 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d  ot used, its nam
2de00 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20  e is just '{}'. 
2de10 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20   If no index is 
2de20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e  used.  ** the in
2de30 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73  dex is listed as
2de40 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70   "{}".  If the p
2de50 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
2de60 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ed the.  ** inde
2de70 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20  x name is '*'.. 
2de80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2de90 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b  <nTabList; i++){
2dea0 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
2deb0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65    int n;.    pLe
2dec0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
2ded0 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65  [i];.    pTabIte
2dee0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2def0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2df00 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65  .    z = pTabIte
2df10 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69  m->zAlias;.    i
2df20 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54  f( z==0 ) z = pT
2df30 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
2df40 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  ame;.    n = sql
2df50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
2df60 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61  .    if( n+nQPla
2df70 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
2df80 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31  e3_query_plan)-1
2df90 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2dfa0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2dfb0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2dfc0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2dfd0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
2dfe0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2dff0 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20  n], "{}", 2);.  
2e000 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
2e010 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
2e020 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2e030 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2e040 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e  an[nQPlan], z, n
2e050 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
2e060 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
2e070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
2e080 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
2e090 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
2e0a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
2e0b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2e0c0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
2e0d0 5f 45 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _EQ );.    testc
2e0e0 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
2e0f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e100 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b  E_ROWID_RANGE );
2e110 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2e120 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2e130 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
2e140 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
2e150 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  E) ){.      memc
2e160 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
2e170 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
2e180 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "* ", 2);.      
2e190 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
2e1a0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76   }else if( (pLev
2e1b0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2e1c0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2e1d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  )!=0 ){.      n 
2e1e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2e1f0 30 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  0(pLevel->plan.u
2e200 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pIdx->zName);. 
2e210 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61       if( n+nQPla
2e220 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
2e230 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32  e3_query_plan)-2
2e240 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2e250 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
2e260 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
2e270 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
2e280 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Idx->zName, n);.
2e290 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
2e2a0 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = n;.        sql
2e2b0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2e2c0 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
2e2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e2e0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
2e2f0 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
2e300 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
2e310 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e  } ", 3);.      n
2e320 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20  QPlan += 3;.    
2e330 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  }.  }.  while( n
2e340 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74  QPlan>0 && sqlit
2e350 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2e360 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a  Plan-1]==' ' ){.
2e370 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
2e380 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d  y_plan[--nQPlan]
2e390 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2e3a0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2e3b0 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51  QPlan] = 0;.  nQ
2e3c0 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Plan = 0;.#endif
2e3d0 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
2e3e0 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64  // Testing and d
2e3f0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2e400 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  y */..  /* Recor
2e410 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  d the continuati
2e420 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  on address in th
2e430 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
2e440 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a  cture.  Then.  *
2e450 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * clean up and r
2e460 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65  eturn..  */.  re
2e470 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
2e480 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2e490 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2e4a0 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a  whereBeginError:
2e4b0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
2e4c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
2e4d0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
2e4e0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
2e4f0 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
2e500 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2e510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2e520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2e530 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
2e540 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20  he WHERE loop.  
2e550 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
2e560 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
2e570 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69  Begin() for addi
2e580 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2e590 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2e5a0 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72  te3WhereEnd(Wher
2e5b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
2e5c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2e5d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2e5e0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
2e5f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2e600 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
2e610 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72  el *pLevel;.  Sr
2e620 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
2e630 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
2e640 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
2e650 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2e660 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
2e670 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
2e680 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
2e690 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2e6a0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2e6b0 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  r(i=pWInfo->nLev
2e6c0 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  el-1; i>=0; i--)
2e6d0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
2e6e0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
2e6f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2e700 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
2e710 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a  vel->addrCont);.
2e720 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
2e730 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
2e740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e750 41 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c  AddOp3(v, pLevel
2e760 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
2e770 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c  , pLevel->p2, pL
2e780 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20  evel->p3);.     
2e790 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e7a0 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geP5(v, pLevel->
2e7b0 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p5);.    }.    i
2e7c0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
2e7d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e7e0 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65  IN_ABLE && pLeve
2e7f0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b  l->u.in.nIn>0 ){
2e800 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
2e810 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
2e820 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
2e830 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2e840 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
2e850 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20  >addrNxt);.     
2e860 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75   for(j=pLevel->u
2e870 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  .in.nIn, pIn=&pL
2e880 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2e890 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
2e8a0 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
2e8b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2e8c0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2e8d0 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20  ddrInTop+1);.   
2e8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e8f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
2e900 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  t, pIn->iCur, pI
2e910 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20  n->addrInTop);. 
2e920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e930 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
2e940 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b  n->addrInTop-1);
2e950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2e960 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2e970 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
2e980 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
2e990 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2e9a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
2e9b0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
2e9c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
2e9d0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
2e9e0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
2e9f0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2ea00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2ea10 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
2ea20 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
2ea30 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65    assert( (pLeve
2ea40 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2ea50 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2ea60 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2ea70 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  || (pLevel->plan
2ea80 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2ea90 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a  _INDEXED)!=0 );.
2eaa0 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
2eab0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2eac0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2ead0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2eae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eaf0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
2eb00 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
2eb10 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2eb20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2eb30 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
2eb40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2eb50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2eb60 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
2eb70 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
2eb80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2eb90 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
2eba0 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
2ebb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ebc0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2ebd0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2ebe0 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2ebf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ec00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ec10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2ec20 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
2ec30 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2ec40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ec50 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2ec60 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
2ec70 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
2ec80 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
2ec90 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
2eca0 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
2ecb0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
2ecc0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2ecd0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ece0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
2ecf0 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
2ed00 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
2ed10 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
2ed20 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
2ed30 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
2ed40 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
2ed50 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  ->nLevel==1 || p
2ed60 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70  WInfo->nLevel==p
2ed70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
2ed80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
2ed90 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
2eda0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
2edb0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2edc0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2edd0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2ede0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2edf0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2ee00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2ee10 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2ee20 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2ee30 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2ee40 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2ee50 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2ee60 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
2ee70 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
2ee80 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
2ee90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2eea0 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30  E_OMIT_CLOSE)==0
2eeb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
2eec0 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  t ws = pLevel->p
2eed0 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
2eee0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
2eef0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73  okOnePass && (ws
2ef00 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2ef10 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
2ef20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ef30 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2ef40 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2ef50 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2ef60 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52    if( (ws & WHER
2ef70 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
2ef80 20 28 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d   (ws & WHERE_TEM
2ef90 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20  P_INDEX)==0 ){. 
2efa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2efb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
2efc0 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
2efd0 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
2efe0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2eff0 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
2f000 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63  an index, make c
2f010 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
2f020 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
2f030 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
2f040 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e  ndex in preferen
2f050 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e  ce to the table.
2f060 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
2f070 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
2f080 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76  e table need nev
2f090 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e  er be read from.
2f0a0 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f   This is a perfo
2f0b0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20  rmance boost,.  
2f0c0 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65    ** as the vdbe
2f0d0 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74   level waits unt
2f0e0 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  il the table is 
2f0f0 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75  read before actu
2f100 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ally.    ** seek
2f110 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75  ing the table cu
2f120 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f  rsor to the reco
2f130 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
2f140 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
2f150 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20      ** position 
2f160 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  in the index..  
2f170 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
2f180 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
2f190 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
2f1a0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
2f1b0 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
2f1c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2f1d0 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
2f1e0 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
2f1f0 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
2f200 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
2f210 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
2f220 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
2f230 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
2f240 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
2f250 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
2f260 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
2f270 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
2f280 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
2f290 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
2f2a0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
2f2b0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2f2c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2f2d0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
2f2e0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2f2f0 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  led){.      int 
2f300 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20  k, j, last;.    
2f310 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2f320 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
2f330 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
2f340 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61  u.pIdx;..      a
2f350 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
2f360 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
2f370 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2f380 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b  , pWInfo->iTop);
2f390 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
2f3a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2f3b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
2f3c0 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f  or(k=pWInfo->iTo
2f3d0 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  p; k<last; k++, 
2f3e0 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
2f3f0 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
2f400 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
2f410 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2f420 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2f430 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
2f440 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2f450 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
2f460 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
2f470 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
2f480 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
2f490 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
2f4a0 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a       pOp->p2 = j
2f4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2f4c0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
2f4d0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
2f4e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f510 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
2f520 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2f530 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2f540 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2f550 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d        || j<pIdx-
2f560 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
2f570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2f580 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f  p->opcode==OP_Ro
2f590 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
2f5a0 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
2f5b0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
2f5c0 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
2f5d0 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b  e = OP_IdxRowid;
2f5e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f5f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2f600 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
2f610 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  .  */.  pParse->
2f620 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49  nQueryLoop = pWI
2f630 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
2f640 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66  Loop;.  whereInf
2f650 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
2f660 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.