/ Hex Artifact Content
Login

Artifact 9323b7a65ec9e1f9211d0cd3d21a3b048b195a39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 23 20  _ENABLE_STAT3.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 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 23 64 65 66 69 6e  elpful */.#defin
2c90: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
2ca0: 20 20 20 20 20 30 78 38 30 30 30 30 30 30 30 20       0x80000000 
2cb0: 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f 72 64 65   /* Correct orde
2cc0: 72 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a  r for DISTINCT *
2cd0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
2ce0: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
2cf0: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
2d00: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2d10: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2d20: 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72  auseInit(.  Wher
2d30: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
2d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
2d50: 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e  eClause to be in
2d60: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50  itialized */.  P
2d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2d90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2da0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
2db0: 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f 2a 20   *pMaskSet   /* 
2dc0: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
2dd0: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
2de0: 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f  s to bitmasks */
2df0: 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73  .){.  pWC->pPars
2e00: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
2e10: 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d  C->pMaskSet = pM
2e20: 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 6e  askSet;.  pWC->n
2e30: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
2e40: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
2e50: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
2e60: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
2e70: 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43  ->aStatic;.  pWC
2e80: 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d 0a 0a  ->vmask = 0;.}..
2e90: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
2ea0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
2eb0: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
2ec0: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
2ed0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  *);../*.** Deall
2ee0: 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79  ocate all memory
2ef0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2f00: 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f   a WhereOrInfo o
2f10: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
2f20: 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66   void whereOrInf
2f30: 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  oDelete(sqlite3 
2f40: 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f  *db, WhereOrInfo
2f50: 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61   *p){.  whereCla
2f60: 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29  useClear(&p->wc)
2f70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2f80: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2f90: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c  ** Deallocate al
2fa0: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
2fb0: 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65  ted with a Where
2fc0: 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  AndInfo object..
2fd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2fe0: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
2ff0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
3000: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b  hereAndInfo *p){
3010: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
3020: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
3030: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3040: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
3050: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
3060: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
3070: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3080: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3090: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
30a0: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
30b0: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
30c0: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
30d0: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
30e0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
30f0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
3100: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
3110: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
3120: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *a;.  sqlite3 *d
3130: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
3140: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  >db;.  for(i=pWC
3150: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
3160: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
3170: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
3180: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
3190: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
31a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
31b0: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29  te(db, a->pExpr)
31c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
31e0: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20  M_ORINFO ){.    
31f0: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c    whereOrInfoDel
3200: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72  ete(db, a->u.pOr
3210: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Info);.    }else
3220: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
3230: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29  & TERM_ANDINFO )
3240: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64  {.      whereAnd
3250: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
3260: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20  ->u.pAndInfo);. 
3270: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
3280: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
3290: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
32a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43  e3DbFree(db, pWC
32b0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
32c0: 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
32d0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e  new WhereTerm en
32e0: 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65  try to the Where
32f0: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57  Clause object pW
3300: 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68  C..** The new Wh
3310: 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69  ereTerm object i
3320: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72  s constructed fr
3330: 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69  om Expr p and wi
3340: 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54  th wtFlags..** T
3350: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d  he index in pWC-
3360: 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20  >a[] of the new 
3370: 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74  WhereTerm is ret
3380: 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
3390: 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e  ..** 0 is return
33a0: 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68  ed if the new Wh
33b0: 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f  ereTerm could no
33c0: 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74  t be added due t
33d0: 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  o a memory.** al
33e0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20  location error. 
33f0: 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   The memory allo
3400: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77  cation failure w
3410: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
3420: 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61  in.** the db->ma
3430: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
3440: 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c  so that higher-l
3450: 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63  evel functions c
3460: 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a  an detect it..**
3470: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3480: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
3490: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
34a0: 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73  WC->a[] array as
34b0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
34c0: 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73  * If the wtFlags
34d0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64   argument includ
34e0: 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c  es TERM_DYNAMIC,
34f0: 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69   then responsibi
3500: 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65  lity.** for free
3510: 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69  ing the expressi
3520: 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20  on p is assumed 
3530: 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  by the WhereClau
3540: 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a  se object pWC..*
3550: 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65  * This is true e
3560: 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74  ven if this rout
3570: 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c  ine fails to all
3580: 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72  ocate a new Wher
3590: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  eTerm..**.** WAR
35a0: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
35b0: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
35c0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
35d0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
35e0: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
35f0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
3600: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
3610: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
3620: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
3630: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
3640: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
3650: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
3660: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
3670: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
3680: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
3690: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
36a0: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
36b0: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
36c0: 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20  , u8 wtFlags){. 
36d0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
36e0: 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  m;.  int idx;.  
36f0: 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67  testcase( wtFlag
3700: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
3710: 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30   );  /* EV: R-00
3720: 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69  211-15100 */.  i
3730: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
3740: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
3750: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
3760: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
3770: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
3780: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
3790: 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74    pWC->a = sqlit
37a0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
37b0: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
37c0: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
37d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
37e0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >a==0 ){.      i
37f0: 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45 52  f( wtFlags & TER
3800: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
3810: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3820: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
3830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43       }.      pWC
3840: 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20  ->a = pOld;.    
3850: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3860: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43  }.    memcpy(pWC
3870: 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f  ->a, pOld, sizeo
3880: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43  f(pWC->a[0])*pWC
3890: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  ->nTerm);.    if
38a0: 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74  ( pOld!=pWC->aSt
38b0: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71  atic ){.      sq
38c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
38d0: 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pOld);.    }.   
38e0: 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71   pWC->nSlot = sq
38f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
3900: 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69  e(db, pWC->a)/si
3910: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b  zeof(pWC->a[0]);
3920: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
3930: 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43  pWC->a[idx = pWC
3940: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54  ->nTerm++];.  pT
3950: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a  erm->pExpr = p;.
3960: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
3970: 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54   = wtFlags;.  pT
3980: 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  erm->pWC = pWC;.
3990: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
39a0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
39b0: 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  idx;.}../*.** Th
39c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74  is routine ident
39d0: 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73  ifies subexpress
39e0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
39f0: 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a  E clause where.*
3a00: 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  * each subexpres
3a10: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
3a20: 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  d by the AND ope
3a30: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
3a40: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
3a50: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
3a60: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
3a70: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
3a80: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
3a90: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
3aa0: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
3ab0: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
3ac0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
3ad0: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
3ae0: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
3af0: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
3b00: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
3b10: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
3b20: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
3b30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
3b40: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
3b50: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
3b60: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
3b70: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
3b80: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
3b90: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
3ba0: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
3bb0: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
3bc0: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
3bd0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
3be0: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
3bf0: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
3c00: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
3c10: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
3c20: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
3c30: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
3c40: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
3c50: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
3c60: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
3c70: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
3c80: 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72  .  The slot[] ar
3c90: 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65  ray grows as nee
3ca0: 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a  ded to contain.*
3cb0: 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * all terms of t
3cc0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
3cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ce0: 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65  whereSplit(Where
3cf0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
3d00: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70  r *pExpr, int op
3d10: 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28  ){.  pWC->op = (
3d20: 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78  u8)op;.  if( pEx
3d30: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
3d40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
3d50: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
3d60: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
3d70: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
3d80: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
3d90: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
3da0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
3db0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
3dc0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
3dd0: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
3de0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
3df0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
3e00: 73 65 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b  set (a WhereMask
3e10: 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23  Set object).*/.#
3e20: 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53  define initMaskS
3e30: 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c  et(P)  memset(P,
3e40: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a   0, sizeof(*P)).
3e50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3e60: 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
3e70: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e  e given cursor n
3e80: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30  umber.  Return 0
3e90: 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69   if.** iCursor i
3ea0: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74  s not in the set
3eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
3ec0: 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72  ask getMask(Wher
3ed0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
3ee0: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
3ef0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
3f00: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
3f10: 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  <=sizeof(Bitmask
3f20: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
3f30: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
3f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
3f50: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
3f60: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
3f70: 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61 73   return ((Bitmas
3f80: 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a 20  k)1)<<i;.    }. 
3f90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3fa0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
3fb0: 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63 75   new mask for cu
3fc0: 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a  rsor iCursor..**
3fd0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  .** There is one
3fe0: 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62 6c   cursor per tabl
3ff0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
4000: 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62 65  ause.  The numbe
4010: 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69  r of.** tables i
4020: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
4030: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
4040: 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e 20  a test early in 
4050: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  the.** sqlite3Wh
4060: 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74 69  ereBegin() routi
4070: 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20  ne.  So we know 
4080: 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53 65  that the pMaskSe
4090: 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79  t->ix[].** array
40a0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
40b0: 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  flow..*/.static 
40c0: 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28  void createMask(
40d0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
40e0: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
40f0: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
4100: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
4110: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
4120: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
4130: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
4140: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
4150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4160: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
4170: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
4180: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
4190: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
41a0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
41b0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
41c0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
41d0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
41e0: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
41f0: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
4200: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
4210: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
4220: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
4230: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
4240: 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73 6f  oked sqlite3Reso
4250: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 6f  lveExprNames() o
4260: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
4270: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
4280: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
4290: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
42a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
42b0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
42c0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
42d0: 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  prNames() routin
42e0: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
42f0: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
4300: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
4310: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
4320: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
4330: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
4340: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
4350: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4360: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
4370: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
4380: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
4390: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
43a0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
43b0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
43c0: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
43d0: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
43e0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
43f0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4400: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4410: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
4420: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
4430: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
4440: 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20 53  WhereMaskSet*, S
4450: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
4460: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
4470: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
4480: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
4490: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
44a0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
44b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
44c0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
44d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
44e0: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
44f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
4500: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
4510: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
4520: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
4530: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4540: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
4550: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4560: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
4570: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45 78  pLeft);.  if( Ex
4580: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4590: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
45a0: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
45b0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
45c0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
45d0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  x.pSelect);.  }e
45e0: 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  lse{.    mask |=
45f0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4600: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4610: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  >x.pList);.  }. 
4620: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
4630: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4640: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4650: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  e(WhereMaskSet *
4660: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
4670: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4680: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
4690: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
46a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
46b0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
46c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
46d0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
46e0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
46f0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
4700: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
4710: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4720: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4730: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4740: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4750: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
4760: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
4770: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
4780: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
4790: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
47a0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
47b0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
47c0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
47d0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
47e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
47f0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
4800: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4810: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4820: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
4830: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
4840: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4850: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
4860: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
4870: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4880: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
4890: 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d  aving);.    pS =
48a0: 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d   pS->pPrior;.  }
48b0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
48c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
48d0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
48e0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
48f0: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
4900: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
4910: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
4920: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
4930: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
4940: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
4950: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
4960: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
4970: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a  ", and "IN"..**.
4980: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
4990: 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32 36  N-OF: R-59926-26
49a0: 33 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c 65  393 To be usable
49b0: 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20 74   by an index a t
49c0: 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f  erm must be.** o
49d0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
49e0: 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f  lowing forms: co
49f0: 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69 6f  lumn = expressio
4a00: 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65  n column > expre
4a10: 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ssion.** column 
4a20: 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  >= expression co
4a30: 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69 6f  lumn < expressio
4a40: 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72  n column <= expr
4a50: 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73  ession.** expres
4a60: 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78  sion = column ex
4a70: 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d  pression > colum
4a80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20  n expression >= 
4a90: 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73  column.** expres
4aa0: 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78  sion < column ex
4ab0: 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75  pression <= colu
4ac0: 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20  mn column IN.** 
4ad0: 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74  (expression-list
4ae0: 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62  ) column IN (sub
4af0: 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53  query) column IS
4b00: 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20   NULL.*/.static 
4b10: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
4b20: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
4b30: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20   TK_GT>TK_EQ && 
4b40: 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_GT<TK_GE );. 
4b50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54   assert( TK_LT>T
4b60: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b  K_EQ && TK_LT<TK
4b70: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b80: 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20   TK_LE>TK_EQ && 
4b90: 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LE<TK_GE );. 
4ba0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
4bb0: 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74  TK_EQ+4 );.  ret
4bc0: 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  urn op==TK_IN ||
4bd0: 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f   (op>=TK_EQ && o
4be0: 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d  p<=TK_GE) || op=
4bf0: 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f  =TK_ISNULL;.}../
4c00: 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f 62  *.** Swap two ob
4c10: 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54 59  jects of type TY
4c20: 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  PE..*/.#define S
4c30: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
4c40: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
4c50: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
4c60: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
4c70: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
4c80: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
4c90: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
4ca0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
4cb0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
4cc0: 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  * If a collation
4cd0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73   sequence is ass
4ce0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74  ociated with eit
4cf0: 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20  her the left or 
4d00: 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66  right.** side of
4d10: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c   the comparison,
4d20: 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f   it remains asso
4d30: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4d40: 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a  same side after.
4d50: 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69  ** the commutati
4d60: 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74  on. So "Y collat
4d70: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
4d80: 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f  ecomes .** "X co
4d90: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
4da0: 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  Y". This is beca
4db0: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
4dc0: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
4dd0: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
4de0: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
4df0: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
4e00: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
4e10: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
4e20: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
4e30: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
4e40: 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f  son the EP_ExpCo
4e50: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
4e60: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
4e70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
4e80: 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20  prCommute(Parse 
4e90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4ea0: 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70  Expr){.  u16 exp
4eb0: 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e  Right = (pExpr->
4ec0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
4ed0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a  EP_ExpCollate);.
4ee0: 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20    u16 expLeft = 
4ef0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
4f00: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4f10: 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  late);.  assert(
4f20: 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72   allowedOp(pExpr
4f30: 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e  ->op) && pExpr->
4f40: 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70  op!=TK_IN );.  p
4f50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
4f60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
4f70: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
4f80: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4f90: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
4fa0: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
4fb0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
4fc0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
4fd0: 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65  );.  SWAP(CollSe
4fe0: 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  q*,pExpr->pRight
4ff0: 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70  ->pColl,pExpr->p
5000: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20  Left->pColl);.  
5010: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
5020: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
5030: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e  Right->flags & ~
5040: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c  EP_ExpCollate) |
5050: 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70   expLeft;.  pExp
5060: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
5070: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
5080: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
5090: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69  Collate) | expRi
50a0: 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72  ght;.  SWAP(Expr
50b0: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
50c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
50d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
50e0: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
50f0: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
5100: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
5110: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
5120: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
5130: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
5140: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
5150: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
5160: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
5170: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
5180: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
5190: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
51a0: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
51b0: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
51c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
51d0: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
51e0: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
51f0: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
5200: 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72 4d  ic u16 operatorM
5210: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75  ask(int op){.  u
5220: 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  16 c;.  assert( 
5230: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
5240: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
5250: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
5260: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
5270: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
5280: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
5290: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
52a0: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c  assert( (WO_EQ<<
52b0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78  (op-TK_EQ)) < 0x
52c0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20  7fff );.    c = 
52d0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70  (u16)(WO_EQ<<(op
52e0: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20  -TK_EQ));.  }.  
52f0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
5300: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49  SNULL || c==WO_I
5310: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  SNULL );.  asser
5320: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20  t( op!=TK_IN || 
5330: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73  c==WO_IN );.  as
5340: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20  sert( op!=TK_EQ 
5350: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  || c==WO_EQ );. 
5360: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5370: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29  LT || c==WO_LT )
5380: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5390: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c  TK_LE || c==WO_L
53a0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  E );.  assert( o
53b0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57  p!=TK_GT || c==W
53c0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_GT );.  assert
53d0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63  ( op!=TK_GE || c
53e0: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74  ==WO_GE );.  ret
53f0: 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn c;.}../*.** 
5400: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65 72  Search for a ter
5410: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
5420: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f 66  lause that is of
5430: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
5440: 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65  > <expr>".** whe
5450: 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72 65  re X is a refere
5460: 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75  nce to the iColu
5470: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
5480: 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   and <op> is one
5490: 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78   of.** the WO_xx
54a0: 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20   operator codes 
54b0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
54c0: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a   op parameter..*
54d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
54e0: 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20  er to the term. 
54f0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
5500: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
5510: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e  c WhereTerm *fin
5520: 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c  dTerm(.  WhereCl
5530: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
5540: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
5550: 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  se to be searche
5560: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5580: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
5590: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43   LHS */.  int iC
55a0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
55b0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
55c0: 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74   of LHS */.  Bit
55d0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
55e0: 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e     /* RHS must n
55f0: 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20  ot overlap with 
5600: 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75  this mask */.  u
5610: 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  32 op,          
5620: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
5630: 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73  WO_xx values des
5640: 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72  cribing operator
5650: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5660: 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x           /* M
5670: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
5680: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
5690: 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  x, if not NULL *
56a0: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
56b0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b   *pTerm;.  int k
56c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ;.  assert( iCur
56d0: 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57  >=0 );.  op &= W
56e0: 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65  O_ALL;.  for(pTe
56f0: 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43  rm=pWC->a, k=pWC
5700: 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c  ->nTerm; k; k--,
5710: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
5720: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
5730: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
5740: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65    && (pTerm->pre
5750: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
5760: 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  ady)==0.       &
5770: 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  & pTerm->u.leftC
5780: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
5790: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
57a0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29  >eOperator & op)
57b0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
57c0: 20 69 66 28 20 70 49 64 78 20 26 26 20 70 54 65   if( pIdx && pTe
57d0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
57e0: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
57f0: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
5800: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
5810: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
5820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
5830: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
5840: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
5850: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
5860: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
5870: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
5880: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
5890: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
58a0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
58b0: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
58c0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
58d0: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
58e0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;..        /* Fi
58f0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c  gure out the col
5900: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
5910: 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e  required from an
5920: 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20   index for.     
5930: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
5940: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
5950: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
5960: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
5970: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
5980: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
5990: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
59a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
59b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
59c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
59d0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
59e0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
59f0: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
5a00: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ht);.        ass
5a10: 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61  ert(pColl || pPa
5a20: 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20  rse->nErr);..   
5a30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49       for(j=0; pI
5a40: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
5a50: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
5a60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
5a70: 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f  VER(j>=pIdx->nCo
5a80: 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20 30  lumn) ) return 0
5a90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5aa0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
5ab0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5ac0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49  pColl->zName, pI
5ad0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29  dx->azColl[j]) )
5ae0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5af0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
5b00: 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTerm;.    }.  }
5b10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5b20: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5b30: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
5b40: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
5b50: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
5b60: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
5b70: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
5b80: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
5b90: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
5ba0: 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f  ause.  .**.**.*/
5bb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5bc0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53  rAnalyzeAll(.  S
5bd0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5be0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46  ,       /* the F
5bf0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
5c00: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5c20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5c30: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
5c40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5c50: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b  (i=pWC->nTerm-1;
5c60: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5c70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61   exprAnalyze(pTa
5c80: 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a  bList, pWC, i);.
5c90: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
5cb0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  OPTIMIZATION./*.
5cc0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
5cd0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
5ce0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b  ression is a LIK
5cf0: 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74  E or GLOB operat
5d00: 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  or that.** can b
5d10: 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
5d20: 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  g inequality con
5d30: 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72  straints.  Retur
5d40: 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a  n TRUE if it is.
5d50: 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20  ** so and false 
5d60: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  if not..**.** In
5d70: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f   order for the o
5d80: 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70  perator to be op
5d90: 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52  timizible, the R
5da0: 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72  HS must be a str
5db0: 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74  ing.** literal t
5dc0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  hat does not beg
5dd0: 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61  in with a wildca
5de0: 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  rd.  .*/.static 
5df0: 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  int isLikeOrGlob
5e00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5e10: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
5e20: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5e30: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5e40: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
5e50: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
5e60: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
5e70: 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78   Expr **ppPrefix
5e80: 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ,  /* Pointer to
5e90: 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65   TK_STRING expre
5ea0: 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65  ssion with patte
5eb0: 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  rn prefix */.  i
5ec0: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
5ed0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5ee0: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
5ef0: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
5f00: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
5f10: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5f20: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5f30: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5f40: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5f50: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5f60: 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20  ar *z = 0;      
5f70: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5f80: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5f90: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5fa0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5fb0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
5fc0: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
5fd0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5fe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5ff0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
6000: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
6010: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
6020: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
6030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6040: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
6050: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
6060: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6080: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
6090: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
60a0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
60b0: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
60c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
60d0: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
60e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
60f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6100: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6110: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
6120: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
6130: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20   = 0;.  int op; 
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20     /* Opcode of 
6160: 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28  pRight */..  if(
6170: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
6180: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
6190: 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, pnoCase, wc) 
61a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
61b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
61c0: 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20  TE_EBCDIC.  if( 
61d0: 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72  *pnoCase ) retur
61e0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c  n 0;.#endif.  pL
61f0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6200: 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20  List;.  pLeft = 
6210: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6220: 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  r;.  if( pLeft->
6230: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
6240: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
6250: 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c  nity(pLeft)!=SQL
6260: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
6270: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32      /* IMP: R-02
6280: 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65  065-49465 The le
6290: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
62a0: 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  the LIKE or GLOB
62b0: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20   operator must. 
62c0: 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d     ** be the nam
62d0: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  e of an indexed 
62e0: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54  column with TEXT
62f0: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
6300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6310: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
6320: 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29  >iColumn!=(-1) )
6330: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b  ; /* Because IPK
6340: 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f 54   never has AFF_T
6350: 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74  EXT */..  pRight
6360: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
6370: 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69  Expr;.  op = pRi
6380: 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  ght->op;.  if( o
6390: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
63a0: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68  {.    op = pRigh
63b0: 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66  t->op2;.  }.  if
63c0: 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ( op==TK_VARIABL
63d0: 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70  E ){.    Vdbe *p
63e0: 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61 72  Reprepare = pPar
63f0: 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a  se->pReprepare;.
6400: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6410: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  Right->iColumn;.
6420: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
6430: 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
6440: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c  Reprepare, iCol,
6450: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
6460: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
6470: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
6480: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c  _type(pVal)==SQL
6490: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
64a0: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71    z = (char *)sq
64b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
64c0: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
64d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
64e0: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
64f0: 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 20 2f 2a  pVdbe, iCol); /*
6500: 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32   IMP: R-23257-02
6510: 37 37 38 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  778 */.    asser
6520: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
6530: 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52  K_VARIABLE || pR
6540: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ight->op==TK_REG
6550: 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65  ISTER );.  }else
6560: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
6570: 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52  NG ){.    z = pR
6580: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
6590: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20    }.  if( z ){. 
65a0: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
65b0: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
65c0: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
65d0: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
65e0: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
65f0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
6600: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
6610: 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d   255!=(u8)z[cnt-
6620: 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  1] ){.      Expr
6630: 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20   *pPrefix;.     
6640: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
6650: 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  c==wc[0] && z[cn
6660: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70  t+1]==0;.      p
6670: 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33  Prefix = sqlite3
6680: 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49  Expr(db, TK_STRI
6690: 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  NG, z);.      if
66a0: 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65  ( pPrefix ) pPre
66b0: 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e  fix->u.zToken[cn
66c0: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  t] = 0;.      *p
66d0: 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69  pPrefix = pPrefi
66e0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d  x;.      if( op=
66f0: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a  =TK_VARIABLE ){.
6700: 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
6710: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6730: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76  VdbeSetVarmask(v
6740: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
6750: 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33  n); /* IMP: R-23
6760: 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20  257-02778 */.   
6770: 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d       if( *pisCom
6780: 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d  plete && pRight-
6790: 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a  >u.zToken[1] ){.
67a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
67b0: 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c  the rhs of the L
67c0: 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  IKE expression i
67d0: 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e  s a variable, an
67e0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  d the current.  
67f0: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
6800: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   of the variable
6810: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
6820: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b  no need to invok
6830: 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20  e the LIKE.     
6840: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
6850: 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72  , then no OP_Var
6860: 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64  iable will be ad
6870: 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ded to the progr
6880: 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  am..          **
6890: 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f   This causes pro
68a0: 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71  blems for the sq
68b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
68c0: 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20  eter_name().    
68d0: 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f        ** API. To
68e0: 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d   workaround them
68f0: 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50  , add a dummy OP
6900: 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a  _Variable here..
6910: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20            */ .  
6920: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6930: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6940: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6960: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
6970: 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b  se, pRight, r1);
6980: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6990: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
69a0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
69b0: 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30  rentAddr(v)-1, 0
69c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
69d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
69e0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
69f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a00: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6a10: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     z = 0;.    }.
6a20: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61    }..  sqlite3Va
6a30: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
6a40: 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a   return (z!=0);.
6a50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6a60: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
6a70: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23  IMIZATION */...#
6a80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6a90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6aa0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
6ab0: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
6ac0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
6ad0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
6ae0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d          column M
6af0: 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20  ATCH expr.**.** 
6b00: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65  If it is then re
6b10: 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e  turn TRUE.  If n
6b20: 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ot, return FALSE
6b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b40: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
6b50: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
6b60: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73      /* Test this
6b70: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
6b80: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
6b90: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  ist;..  if( pExp
6ba0: 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49  r->op!=TK_FUNCTI
6bb0: 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ON ){.    return
6bc0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
6bd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
6be0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
6bf0: 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  tch")!=0 ){.    
6c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6c10: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
6c20: 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  .pList;.  if( pL
6c30: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
6c40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6c50: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
6c60: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
6c70: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
6c80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6c90: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
6ca0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6cb0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6cc0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
6cd0: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
6ce0: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
6cf0: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
6d00: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
6d10: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
6d20: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
6d30: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
6d40: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
6d50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
6d60: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
6d70: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
6d80: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
6d90: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
6da0: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
6db0: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
6dc0: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
6dd0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
6de0: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
6df0: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
6e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6e10: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
6e20: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
6e30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
6e40: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61  QUERY)./*.** Ana
6e50: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
6e60: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f   consists of two
6e70: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
6e80: 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d  ected.** subterm
6e90: 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a  s.  So in:.**.**
6ea0: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20       ... WHERE  
6eb0: 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f  (a=5) AND (b=7 O
6ec0: 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41  R c=9 OR d=13) A
6ed0: 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20  ND (d=13).**    
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e        ^^^^^^^^^^
6f00: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a  ^^^^^^^^^^.**.**
6f10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
6f20: 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63  alyzes terms suc
6f30: 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20  h as the middle 
6f40: 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76  term in the abov
6f50: 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20  e example..** A 
6f60: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
6f70: 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61  ct is computed a
6f80: 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  nd attached to t
6f90: 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a  he term under.**
6fa0: 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72   analysis, regar
6fb0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
6fc0: 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c  come of the anal
6fd0: 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a  ysis.  Hence:.**
6fe0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6ff0: 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20  m.wtFlags   |=  
7000: 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20  TERM_ORINFO.**  
7010: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70     WhereTerm.u.p
7020: 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e  OrInfo  =  a dyn
7030: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
7040: 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f  ed WhereOrTerm o
7050: 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bject.**.** The 
7060: 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
7070: 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77  zed must have tw
7080: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d  o or more of OR-
7090: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72  connected subter
70a0: 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  ms..** A single 
70b0: 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65  subterm might be
70c0: 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f   a set of AND-co
70d0: 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74  nnected sub-subt
70e0: 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  erms..** Example
70f0: 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72  s of terms under
7100: 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a   analysis:.**.**
7110: 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e       (A)     t1.
7120: 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74  x=t2.y OR t1.x=t
7130: 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f  2.z OR t1.y=15 O
7140: 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a  R t1.z=t3.a+5.**
7150: 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65       (B)     x=e
7160: 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20  xpr1 OR expr2=x 
7170: 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20  OR x=expr3.**   
7180: 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74    (C)     t1.x=t
7190: 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e  2.y OR (t1.x=t2.
71a0: 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a  z AND t1.y=15).*
71b0: 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d  *     (D)     x=
71c0: 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41  expr1 OR (y>11 A
71d0: 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49  ND y<22 AND z LI
71e0: 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a  KE '*hello*').**
71f0: 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e       (E)     (p.
7200: 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e  a=1 AND q.b=2 AN
7210: 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78  D r.c=3) OR (p.x
7220: 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44  =4 AND q.y=5 AND
7230: 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41   r.z=6).**.** CA
7240: 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61  SE 1:.**.** If a
7250: 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20  ll subterms are 
7260: 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d  of the form T.C=
7270: 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69  expr for some si
7280: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43  ngle column of C
7290: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
72a0: 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69  le T (as shown i
72b0: 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76  n example B abov
72c0: 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e) then create a
72d0: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
72e0: 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20  term that is an 
72f0: 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78  equivalent IN ex
7300: 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74  pression.  In ot
7310: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
7320: 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20  e term.** being 
7330: 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a  analyzed is:.**.
7340: 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72  **      x = expr
7350: 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78  1  OR  expr2 = x
7360: 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a    OR  x = expr3.
7370: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  **.** then creat
7380: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  e a new virtual 
7390: 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a  term like this:.
73a0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
73b0: 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70  (expr1,expr2,exp
73c0: 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32  r3).**.** CASE 2
73d0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  :.**.** If all s
73e0: 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65  ubterms are inde
73f0: 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c  xable by a singl
7400: 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20  e table T, then 
7410: 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  set.**.**     Wh
7420: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
7430: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  r              =
7440: 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57    WO_OR.**     W
7450: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
7460: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c  fo->indexable  |
7470: 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  =  the cursor nu
7480: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54  mber for table T
7490: 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  .**.** A subterm
74a0: 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20   is "indexable" 
74b0: 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20  if it is of the 
74c0: 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70  form.** "T.C <op
74d0: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
74e0: 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  C is any column 
74f0: 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a  of table T and .
7500: 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  ** <op> is one o
7510: 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22  f "=", "<", "<="
7520: 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53  , ">", ">=", "IS
7530: 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e   NULL", or "IN".
7540: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
7550: 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20   also indexable 
7560: 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20  if it is an AND 
7570: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  of two or more.*
7580: 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74  * subsubterms at
7590: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68   least one of wh
75a0: 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65  ich is indexable
75b0: 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44  .  Indexable AND
75c0: 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61   .** subterms ha
75d0: 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74  ve their eOperat
75e0: 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44  or set to WO_AND
75f0: 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a   and they have.*
7600: 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74  * u.pAndInfo set
7610: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
7620: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
7630: 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e  eAndTerm object.
7640: 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74  .**.** From anot
7650: 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65  her point of vie
7660: 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d  w, "indexable" m
7670: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75  eans that the su
7680: 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70  bterm could.** p
7690: 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73  otentially be us
76a0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
76b0: 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61   if an appropria
76c0: 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e  te index exists.
76d0: 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69  .** This analysi
76e0: 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69  s does not consi
76f0: 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  der whether or n
7700: 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69  ot the index exi
7710: 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20  sts; that.** is 
7720: 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65  something the be
7730: 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e  stIndex() routin
7740: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
7750: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
7760: 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61  .** only looks a
7770: 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72  t whether subter
7780: 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ms appropriate f
7790: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
77a0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
77b0: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
77c0: 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69  E above all sati
77d0: 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74  sfy case 2.  But
77e0: 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c   if a term.** al
77f0: 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61  so statisfies ca
7800: 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29  se 1 (such as B)
7810: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
7820: 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c  e optimizer will
7830: 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65  .** always prefe
7840: 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20  r case 1, so in 
7850: 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65  that case we pre
7860: 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32  tend that case 2
7870: 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73   is not.** satis
7880: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d  fied..**.** It m
7890: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
78a0: 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74   that multiple t
78b0: 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61  ables are indexa
78c0: 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ble.  For exampl
78d0: 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20  e,.** (E) above 
78e0: 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20  is indexable on 
78f0: 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64  tables P, Q, and
7900: 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20   R..**.** Terms 
7910: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73  that satisfy cas
7920: 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74  e 2 are candidat
7930: 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79  es for lookup by
7940: 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61   using.** separa
7950: 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69  te indices to fi
7960: 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61  nd rowids for ea
7970: 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63  ch subterm and c
7980: 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20  omposing.** the 
7990: 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77  union of all row
79a0: 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53  ids using a RowS
79b0: 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
79c0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
79d0: 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65  o "bitmap indice
79e0: 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61  s" in other data
79f0: 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a  base engines..**
7a00: 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a  .** OTHERWISE:.*
7a10: 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
7a20: 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20  case 1 nor case 
7a30: 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65  2 apply, then le
7a40: 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f  ave the eOperato
7a50: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f  r set to.** zero
7a60: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20  .  This term is 
7a70: 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73  not useful for s
7a80: 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
7a90: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
7aa0: 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69  eOrTerm(.  SrcLi
7ab0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
7ac0: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
7ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
7ae0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
7af0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f         /* the co
7b00: 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61  mplete WHERE cla
7b10: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
7b20: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
7b30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
7b40: 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65  he OR-term to be
7b50: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
7b60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
7b70: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pWC->pParse;  
7b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
7b90: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7ba0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7bb0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
7bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7bd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
7be0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
7bf0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
7c00: 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20  idxTerm];    /* 
7c10: 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
7c20: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70  nalyzed */.  Exp
7c30: 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
7c40: 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->pExpr;        
7c50: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7c60: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  ession of the te
7c70: 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  rm */.  WhereMas
7c80: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d  kSet *pMaskSet =
7c90: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20   pWC->pMaskSet; 
7ca0: 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61 73  /* Table use mas
7cb0: 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ks */.  int i;  
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
7cf0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7d00: 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20  e *pOrWc;       
7d10: 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54  /* Breakup of pT
7d20: 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  erm into subterm
7d30: 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  s */.  WhereTerm
7d40: 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20   *pOrTerm;      
7d50: 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77   /* A Sub-term w
7d60: 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20  ithin the pOrWc 
7d70: 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f  */.  WhereOrInfo
7d80: 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f   *pOrInfo;     /
7d90: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  * Additional inf
7da0: 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61  ormation associa
7db0: 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a  ted with pTerm *
7dc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67  /.  Bitmask chng
7dd0: 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a  ToIN;         /*
7de0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   Tables that mig
7df0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ht satisfy case 
7e00: 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  1 */.  Bitmask i
7e10: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
7e20: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
7e30: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73  are indexable, s
7e40: 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32  atisfying case 2
7e50: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42   */..  /*.  ** B
7e60: 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75  reak the OR clau
7e70: 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61  se into its sepa
7e80: 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20  rate subterms.  
7e90: 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65  The subterms are
7ea0: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  .  ** stored in 
7eb0: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
7ec0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
7ed0: 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68  ng within the Wh
7ee0: 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f  ereOrInfo.  ** o
7ef0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74  bject that is at
7f00: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72  tached to the or
7f10: 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65  iginal OR clause
7f20: 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73   term..  */.  as
7f30: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
7f40: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59  Flags & (TERM_DY
7f50: 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46  NAMIC|TERM_ORINF
7f60: 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29  O|TERM_ANDINFO))
7f70: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7f80: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f   pExpr->op==TK_O
7f90: 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e  R );.  pTerm->u.
7fa0: 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66  pOrInfo = pOrInf
7fb0: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
7fc0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7fd0: 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20  of(*pOrInfo));. 
7fe0: 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20   if( pOrInfo==0 
7ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72  ) return;.  pTer
8000: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8010: 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72  RM_ORINFO;.  pOr
8020: 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77  Wc = &pOrInfo->w
8030: 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  c;.  whereClause
8040: 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43 2d  Init(pOrWc, pWC-
8050: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
8060: 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  t);.  whereSplit
8070: 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54  (pOrWc, pExpr, T
8080: 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61  K_OR);.  exprAna
8090: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f  lyzeAll(pSrc, pO
80a0: 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  rWc);.  if( db->
80b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
80c0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
80d0: 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32   pOrWc->nTerm>=2
80e0: 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   );..  /*.  ** C
80f0: 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f  ompute the set o
8100: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69  f tables that mi
8110: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
8120: 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20  s 1 or 2..  */. 
8130: 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42   indexable = ~(B
8140: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67  itmask)0;.  chng
8150: 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e 76 6d  ToIN = ~(pWC->vm
8160: 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4f  ask);.  for(i=pO
8170: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f  rWc->nTerm-1, pO
8180: 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20  rTerm=pOrWc->a; 
8190: 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c  i>=0 && indexabl
81a0: 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  e; i--, pOrTerm+
81b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72  +){.    if( (pOr
81c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
81d0: 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  & WO_SINGLE)==0 
81e0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e  ){.      WhereAn
81f0: 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b  dInfo *pAndInfo;
8200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8210: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8220: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  r==0 );.      as
8230: 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e  sert( (pOrTerm->
8240: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
8250: 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49  ANDINFO|TERM_ORI
8260: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  NFO))==0 );.    
8270: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
8280: 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d        pAndInfo =
8290: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
82a0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
82b0: 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20  pAndInfo));.    
82c0: 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29    if( pAndInfo )
82d0: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
82e0: 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20  lause *pAndWC;. 
82f0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
8300: 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20   *pAndTerm;.    
8310: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
8320: 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30     Bitmask b = 0
8330: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8340: 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20  m->u.pAndInfo = 
8350: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
8360: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8370: 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e  gs |= TERM_ANDIN
8380: 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54  FO;.        pOrT
8390: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
83a0: 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   WO_AND;.       
83b0: 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49   pAndWC = &pAndI
83c0: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20  nfo->wc;.       
83d0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
83e0: 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50  (pAndWC, pWC->pP
83f0: 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
8400: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70  .        whereSp
8410: 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54  lit(pAndWC, pOrT
8420: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41  erm->pExpr, TK_A
8430: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  ND);.        exp
8440: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
8450: 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20  , pAndWC);.     
8460: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
8470: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
8490: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
84a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
84b0: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41  j=0, pAndTerm=pA
84c0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57  ndWC->a; j<pAndW
84d0: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
84e0: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  AndTerm++){.    
84f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8500: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20  pAndTerm->pExpr 
8510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8520: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e  f( allowedOp(pAn
8530: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  dTerm->pExpr->op
8540: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
8550: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
8560: 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65  pMaskSet, pAndTe
8570: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b  rm->leftCursor);
8580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8590: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
85a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64     }.        ind
85b0: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
85c0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
85d0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
85e0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
85f0: 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b  D ){.      /* Sk
8600: 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72  ip this term for
8610: 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69   now.  We revisi
8620: 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f  t it when we pro
8630: 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a  cess the.      *
8640: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
8650: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72  TERM_VIRTUAL ter
8660: 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  m */.    }else{.
8670: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b        Bitmask b;
8680: 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61  .      b = getMa
8690: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
86a0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
86b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
86c0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
86d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a  TERM_VIRTUAL ){.
86e0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
86f0: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72  m *pOther = &pOr
8700: 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  Wc->a[pOrTerm->i
8710: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20  Parent];.       
8720: 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d   b |= getMask(pM
8730: 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e  askSet, pOther->
8740: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
8750: 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78     }.      index
8760: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20  able &= b;.     
8770: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
8780: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29  perator!=WO_EQ )
8790: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
87a0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  IN = 0;.      }e
87b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  lse{.        chn
87c0: 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20  gToIN &= b;.    
87d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
87e0: 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20   /*.  ** Record 
87f0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8800: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8810: 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20  ase 2.  The set 
8820: 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d  might be.  ** em
8830: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49  pty..  */.  pOrI
8840: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d  nfo->indexable =
8850: 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54   indexable;.  pT
8860: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
8870: 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20   indexable==0 ? 
8880: 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a  0 : WO_OR;..  /*
8890: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68  .  ** chngToIN h
88a0: 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61  olds a set of ta
88b0: 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74  bles that *might
88c0: 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  * satisfy case 1
88d0: 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68  .  But.  ** we h
88e0: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61  ave to do some a
88f0: 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69  dditional checki
8900: 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73  ng to see if cas
8910: 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20  e 1 really.  ** 
8920: 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20  is satisfied..  
8930: 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  **.  ** chngToIN
8940: 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65   will hold eithe
8950: 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74  r 0, 1, or 2 bit
8960: 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61  s.  The 0-bit ca
8970: 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  se means.  ** th
8980: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  at there is no p
8990: 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72  ossibility of tr
89a0: 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f  ansforming the O
89b0: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e  R clause into an
89c0: 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  .  ** IN operato
89d0: 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72  r because one or
89e0: 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74   more terms in t
89f0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e  he OR clause con
8a00: 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68  tain.  ** someth
8a10: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d  ing other than =
8a20: 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  = on a column in
8a30: 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c   the single tabl
8a40: 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20  e.  The 1-bit.  
8a50: 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68  ** case means th
8a60: 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  at every term of
8a70: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
8a80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  s of the form.  
8a90: 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  ** "table.column
8aa0: 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20  =expr" for some 
8ab0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
8ac0: 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20  he one bit that 
8ad0: 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c  is set.  ** will
8ae0: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
8af0: 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e  he common table.
8b00: 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20    We still need 
8b10: 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  to check to make
8b20: 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73  .  ** sure the s
8b30: 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73  ame column is us
8b40: 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e  ed on all terms.
8b50: 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65    The 2-bit case
8b60: 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68   is when.  ** th
8b70: 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  e all terms are 
8b80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62  of the form "tab
8b90: 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65  le1.column=table
8ba0: 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20  2.column".  It. 
8bb0: 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73   ** might be pos
8bc0: 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e  sible to form an
8bd0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
8be0: 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e  h either table1.
8bf0: 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74  column.  ** or t
8c00: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20  able2.column as 
8c10: 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65  the LHS if eithe
8c20: 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65  r is common to e
8c30: 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a  very term of.  *
8c40: 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  * the OR clause.
8c50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
8c60: 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68  that terms of th
8c70: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f  e form "table.co
8c80: 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75  lumn1=table.colu
8c90: 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73  mn2" (the.  ** s
8ca0: 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74  ame table on bot
8cb0: 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d  h sizes of the =
8cc0: 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  =) cannot be opt
8cd0: 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  imized..  */.  i
8ce0: 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  f( chngToIN ){. 
8cf0: 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54     int okToChngT
8d00: 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  oIN = 0;     /* 
8d10: 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76  True if the conv
8d20: 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20  ersion to IN is 
8d30: 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  valid */.    int
8d40: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20   iColumn = -1;  
8d50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
8d60: 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66   index on lhs of
8d70: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
8d80: 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20      int iCursor 
8d90: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8da0: 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f   Table cursor co
8db0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d  mmon to all term
8dc0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d  s */.    int j =
8dd0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8de0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8df0: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  er */..    /* Se
8e00: 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65  arch for a table
8e10: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74   and column that
8e20: 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20   appears on one 
8e30: 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
8e40: 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  ** other of the 
8e50: 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65  == operator in e
8e60: 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54  very subterm.  T
8e70: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  hat table and co
8e80: 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  lumn.    ** will
8e90: 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20   be recorded in 
8ea0: 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c  iCursor and iCol
8eb0: 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68  umn.  There migh
8ec0: 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20  t not be any.   
8ed0: 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61   ** such table a
8ee0: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20  nd column.  Set 
8ef0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20  okToChngToIN if 
8f00: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  an appropriate t
8f10: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  able.    ** and 
8f20: 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20  column is found 
8f30: 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68  but leave okToCh
8f40: 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20  ngToIN false if 
8f50: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  not found..    *
8f60: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
8f70: 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54  <2 && !okToChngT
8f80: 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  oIN; j++){.     
8f90: 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63   pOrTerm = pOrWc
8fa0: 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ->a;.      for(i
8fb0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b  =pOrWc->nTerm-1;
8fc0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
8fd0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
8fe0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
8ff0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
9000: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
9010: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
9020: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
9030: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
9040: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
9050: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
9060: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
9070: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
9080: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
9090: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
90a0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
90b0: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
90c0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
90d0: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
90e0: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
90f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
9100: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
9110: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9120: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9130: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
9140: 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
9150: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
9160: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b  ftCursor))==0 ){
9170: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
9180: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  is term must be 
9190: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61  of the form t1.a
91a0: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20  ==t2.b where t2 
91b0: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  is in the.      
91c0: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20      ** chngToIN 
91d0: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f  set but t1 is no
91e0: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69  t.  This term wi
91f0: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65  ll be either pre
9200: 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20  ceeded.         
9210: 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62   ** or follwed b
9220: 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f  y an inverted co
9230: 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e  py (t2.b==t1.a).
9240: 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d    Skip this term
9250: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
9260: 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72  nd use its inver
9270: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
9280: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
9290: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
92a0: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20  TERM_COPIED );. 
92b0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
92c0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
92d0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
92e0: 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL );.          
92f0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
9300: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
9310: 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52  _COPIED|TERM_VIR
9320: 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20  TUAL) );.       
9330: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
9340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9350: 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d  Column = pOrTerm
9360: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
9370: 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20          iCursor 
9380: 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  = pOrTerm->leftC
9390: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62  ursor;.        b
93a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
93b0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
93c0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e         /* No can
93d0: 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c  didate table+col
93e0: 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20  umn was found.  
93f0: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
9400: 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  cur.        ** o
9410: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
9420: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ration */.      
9430: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
9440: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9450: 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e  ( (chngToIN&(chn
9460: 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a  gToIN-1))==0 );.
9470: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9480: 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73  chngToIN==getMas
9490: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  k(pMaskSet, iCur
94a0: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
94b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
94c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
94d0: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==1 );..      /*
94e0: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   We have found a
94f0: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65   candidate table
9500: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68   and column.  Ch
9510: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9520: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  at.      ** tabl
9530: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  e and column is 
9540: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
9550: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63  term in the OR c
9560: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f  lause */.      o
9570: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b  kToChngToIN = 1;
9580: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d  .      for(; i>=
9590: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  0 && okToChngToI
95a0: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  N; i--, pOrTerm+
95b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
95c0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
95d0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
95e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
95f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9600: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
9610: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9620: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
9630: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
9640: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
9650: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
9660: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
9670: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
9680: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
9690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
96a0: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
96b0: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
96c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
96d0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
96e0: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
96f0: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
9700: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
9710: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
9720: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
9730: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
9740: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
9750: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
9760: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
9770: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
9780: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
9790: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
97a0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
97b0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
97c0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
97d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
97e0: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
97f0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9800: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
9810: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
9820: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
9830: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
9840: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
9850: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
9860: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
9870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9880: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
9890: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
98a0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
98b0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
98c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
98d0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
98e0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
98f0: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
9900: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
9910: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
9920: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
9930: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
9940: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
9950: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
9960: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
9970: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
9980: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
9990: 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30  EV: R-00211-1510
99a0: 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  0.    */.    if(
99b0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
99c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
99d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
99e0: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
99f0: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
9a00: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
9a10: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
9a20: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
9a30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
9a40: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
9a50: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
9a60: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
9a70: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
9a80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
9a90: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
9aa0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
9ab0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
9ac0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
9ad0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
9ae0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
9af0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
9b00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
9b10: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9b20: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
9b30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
9b40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9b50: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
9b60: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
9b70: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9b80: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
9b90: 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20  iCursor );.     
9ba0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9bb0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9bc0: 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==iColumn );.   
9bd0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
9be0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9bf0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9c00: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
9c10: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9c20: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9c30: 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c  (pWC->pParse, pL
9c40: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
9c50: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
9c60: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9c70: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
9c80: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
9c90: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
9ca0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9cb0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
9cc0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
9cd0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9ce0: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
9cf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
9d00: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
9d10: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
9d20: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
9d30: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
9d40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61  Expr);.        a
9d50: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9d60: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
9d70: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
9d80: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
9d90: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
9da0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
9db0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
9dc0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
9dd0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
9de0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
9df0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
9e00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65  ==0 );.        e
9e10: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
9e20: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
9e30: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
9e40: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
9e50: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
9e60: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
9e70: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
9e80: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
9e90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
9ea0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9eb0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9ec0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
9ed0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d     }.      pTerm
9ee0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
9ef0: 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20  _NOOP;  /* case 
9f00: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9f10: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9f20: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9f30: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9f40: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9f50: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9f60: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  /.../*.** The in
9f70: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
9f80: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
9f90: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
9fa0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
9fb0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
9fc0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
9fd0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
9fe0: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
9ff0: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
a000: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
a010: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
a020: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
a030: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
a040: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
a050: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a060: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
a070: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
a080: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
a090: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
a0a0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
a0b0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
a0c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a0d0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
a0e0: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
a0f0: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
a100: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
a110: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
a120: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
a130: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
a140: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
a150: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
a160: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
a170: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
a180: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
a190: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
a1a0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
a1b0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
a1c0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
a1d0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
a1e0: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
a1f0: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
a200: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
a210: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
a220: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
a230: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
a240: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
a250: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
a260: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
a270: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
a280: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
a290: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
a2a0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
a2b0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
a2c0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
a2d0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
a2e0: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
a2f0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a300: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
a310: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
a320: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a330: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a340: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
a350: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
a360: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
a370: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
a380: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
a390: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
a3a0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a3b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a3c0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
a3d0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
a3e0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a3f0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
a400: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
a410: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
a420: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
a430: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
a440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
a460: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
a470: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
a480: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4a0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
a4b0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
a4c0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
a4d0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
a4e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a4f0: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
a500: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
a510: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
a520: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a530: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
a540: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
a550: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
a580: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
a590: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
a5a0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a5b0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
a5c0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
a5d0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
a5e0: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
a610: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
a620: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
a650: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
a660: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
a670: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
a680: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
a690: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a6a0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
a6b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a6c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a6d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a6e0: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
a6f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a700: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
a710: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
a720: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
a730: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
a740: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
a750: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70  Term->pExpr;.  p
a760: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
a770: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a780: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
a790: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
a7a0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a7b0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
a7c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
a7d0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
a7e0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a7f0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
a800: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
a810: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a820: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
a830: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
a840: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
a850: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
a860: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a870: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a880: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
a890: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
a8a0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
a8b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
a8c0: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
a8d0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a8e0: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
a8f0: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
a900: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
a910: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a920: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
a930: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
a940: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
a950: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a960: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
a970: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a980: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a990: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
a9a0: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
a9b0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
a9c0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
a9d0: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
a9e0: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
a9f0: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
aa00: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
aa10: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
aa20: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
aa50: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
aa60: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
aa70: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
aa80: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
aa90: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
aaa0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
aab0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
aac0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
aad0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
aae0: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
aaf0: 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e  (op) && (pTerm->
ab00: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
ab10: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a  ereqLeft)==0 ){.
ab20: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
ab30: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
ab40: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
ab50: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
ab60: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
ab70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
ab80: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  {.      pTerm->l
ab90: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
aba0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
abb0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
abc0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
abd0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65  olumn;.      pTe
abe0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
abf0: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29  operatorMask(op)
ac00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ac10: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
ac20: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ac30: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
ac40: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
ac50: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
ac60: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
ac70: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
ac80: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
ac90: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
aca0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
acb0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
acc0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
acd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ace0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
acf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
ad00: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
ad10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
ad20: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
ad30: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
ad40: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
ad50: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ad60: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ad70: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
ad80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ad90: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
ada0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
adb0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
adc0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
add0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
ade0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
adf0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
ae00: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
ae10: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
ae20: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ae30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ae40: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
ae50: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
ae60: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
ae70: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
ae80: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
ae90: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
aea0: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
aeb0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
aec0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
aed0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
aee0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
aef0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
af00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
af10: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
af20: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
af30: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
af40: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
af50: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
af60: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
af70: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
af80: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
af90: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
afa0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
afb0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
afd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
afe0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
aff0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
b000: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
b010: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
b020: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
b030: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
b040: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
b050: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
b060: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
b070: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
b080: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
b090: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
b0a0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
b0b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
b0c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
b0d0: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
b0e0: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
b0f0: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
b100: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
b110: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
b120: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
b130: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
b140: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
b150: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
b160: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
b170: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
b180: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
b190: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
b1a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
b1b0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
b1c0: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
b1d0: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
b1e0: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
b1f0: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
b200: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
b210: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
b220: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
b230: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
b240: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
b250: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b260: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
b270: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
b280: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
b290: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
b2a0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
b2b0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
b2c0: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
b2d0: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
b2e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
b2f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b300: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
b310: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
b320: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
b330: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b340: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
b350: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
b360: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
b370: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
b380: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b3b0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
b3c0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
b3f0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
b400: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
b410: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
b420: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
b430: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
b440: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b450: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b460: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b470: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
b480: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b490: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
b4a0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b4b0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b4c0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b4d0: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
b4e0: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
b4f0: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b500: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
b510: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
b520: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
b530: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
b540: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b550: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b560: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b570: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b580: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
b590: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
b5a0: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
b5b0: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
b5c0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
b5d0: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
b5e0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
b5f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b600: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
b610: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
b620: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
b630: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
b640: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
b650: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b660: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b670: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b680: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b690: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
b6a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b6b0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
b6c0: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
b6d0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
b6e0: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
b6f0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
b700: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
b710: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
b720: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
b730: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
b740: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
b750: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
b760: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
b770: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
b780: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
b790: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
b7a0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
b7b0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
b7c0: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
b7d0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
b7e0: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
b7f0: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
b800: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
b810: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
b820: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
b830: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
b840: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
b850: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
b860: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
b870: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
b880: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
b890: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
b8a0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
b8b0: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
b8c0: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
b8d0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b8e0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b8f0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
b900: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b910: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
b920: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
b930: 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c 53  xNew2;.    CollS
b940: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
b950: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
b960: 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20  nce to use */.. 
b970: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b980: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b990: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b9a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b9b0: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b9c0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b9d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b9e0: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b9f0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
ba00: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
ba10: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
ba20: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
ba30: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
ba40: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
ba50: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
ba60: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
ba70: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
ba80: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
ba90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
baa0: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
bab0: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
bac0: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
bad0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
bae0: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
baf0: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
bb00: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
bb10: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
bb20: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
bb30: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
bb40: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
bb50: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
bb60: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bb70: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
bb80: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
bb90: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
bba0: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
bbb0: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
bbc0: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
bbd0: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
bbe0: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
bbf0: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
bc00: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
bc10: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
bc20: 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45  lete = 0;   /* E
bc30: 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30 37  V: R-64339-08207
bc40: 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63 20   */...        c 
bc50: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
bc60: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
bc70: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
bc80: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
bc90: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
bca0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
bcb0: 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61 73  LITE_UTF8, noCas
bcc0: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
bcd0: 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20 20  BINARY",0);.    
bce0: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
bcf0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bd00: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
bd20: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
bd30: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
bd40: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
bd50: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
bd60: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
bd70: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
bd80: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
bd90: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
bda0: 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
bdb0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
bdc0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
bdd0: 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
bde0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bdf0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
be00: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
be10: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
be20: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
be50: 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78 70  tColl(sqlite3Exp
be60: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29  rDup(db,pLeft,0)
be70: 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20  , pColl),.      
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
be90: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
bea0: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
beb0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
bec0: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
bed0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
bee0: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
bef0: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
bf00: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
bf10: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
bf20: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
bf30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
bf40: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
bf50: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
bf60: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
bf70: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
bf80: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
bf90: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
bfa0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bfb0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bfc0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
bfd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bfe0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
bff0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
c000: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c010: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
c020: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
c030: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
c040: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
c050: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
c060: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
c070: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
c080: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
c090: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
c0a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
c0b0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
c0c0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
c0d0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
c0e0: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
c0f0: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
c100: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
c110: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
c120: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
c130: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
c140: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
c150: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
c160: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
c170: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
c180: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
c190: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
c1a0: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
c1b0: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
c1c0: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
c1d0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
c1e0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
c1f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
c200: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c210: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c220: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
c230: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c240: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
c250: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
c260: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
c270: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c280: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
c290: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
c2a0: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
c2b0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c2c0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
c2d0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c2e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c2f0: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
c320: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
c330: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
c340: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c350: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c360: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
c370: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c380: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
c390: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c3a0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
c3b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c3c0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
c3d0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
c3e0: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
c3f0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c400: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c410: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c420: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c430: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c440: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c450: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c460: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
c470: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c480: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c490: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c4a0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c4b0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c4c0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c4d0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c4e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c4f0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c500: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c510: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c520: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c530: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c540: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c550: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c560: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 2f  ENABLE_STAT3.  /
c570: 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74  * When sqlite_st
c580: 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at2 histogram da
c590: 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ta is available 
c5a0: 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74  an operator of t
c5b0: 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20  he.  ** form "x 
c5c0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e  IS NOT NULL" can
c5d0: 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76   sometimes be ev
c5e0: 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66  aluated more eff
c5f0: 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73  iciently.  ** as
c600: 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69   "x>NULL" if x i
c610: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
c620: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53   PRIMARY KEY.  S
c630: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20  o construct a.  
c640: 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ** virtual term 
c650: 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20  of that form..  
c660: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
c670: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65  t the virtual te
c680: 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65  rm must be tagge
c690: 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c  d with TERM_VNUL
c6a0: 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45  L.  This.  ** TE
c6b0: 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c  RM_VNULL tag wil
c6c0: 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e  l suppress the n
c6d0: 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
c6e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
c6f0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e   ** of the loop.
c700: 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45    Without the TE
c710: 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74  RM_VNULL flag, t
c720: 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63  he not-null chec
c730: 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  k at.  ** the st
c740: 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  art of the loop 
c750: 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79  will prevent any
c760: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65   results from be
c770: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ing returned..  
c780: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
c790: 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20  op==TK_NOTNULL. 
c7a0: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66    && pExpr->pLef
c7b0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
c7c0: 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  .   && pExpr->pL
c7d0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a  eft->iColumn>=0.
c7e0: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
c7f0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70  NewExpr;.    Exp
c800: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c810: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  ->pLeft;.    int
c820: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65   idxNew;.    Whe
c830: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d  reTerm *pNewTerm
c840: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20  ;..    pNewExpr 
c850: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c860: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20  Parse, TK_GT,.  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c890: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
c8a0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20  ft, 0),.        
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
c8d0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c  (pParse, TK_NULL
c8e0: 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a  , 0, 0, 0), 0);.
c8f0: 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68  .    idxNew = wh
c900: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c910: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20  pWC, pNewExpr,. 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45 52               TER
c940: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c950: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c  YNAMIC|TERM_VNUL
c960: 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e  L);.    if( idxN
c970: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
c980: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c990: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c9a0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c9b0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ght = 0;.      p
c9c0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c9d0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c9e0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c9f0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ca00: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
ca10: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
ca20: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
ca30: 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e 65  WO_GT;.      pNe
ca40: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
ca50: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ca60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ca70: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
ca80: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
ca90: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
caa0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
cab0: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
cac0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
cad0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
cae0: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
caf0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cb00: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f 0a  _ENABLE_STAT */.
cb10: 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e  .  /* Prevent ON
cb20: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
cb30: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f   a LEFT JOIN fro
cb40: 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  m being used to 
cb50: 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  drive.  ** an in
cb60: 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74  dex for tables t
cb70: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
cb80: 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e join..  */.  p
cb90: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
cba0: 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b  t |= extraRight;
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cbc0: 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66 20   TRUE if any of 
cbd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
cbe0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  in pList->a[iFir
cbf0: 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a  st...] contain.*
cc00: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
cc10: 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72   any table other
cc20: 20 74 68 61 6e 20 74 68 65 20 69 42 61 73 65 20   than the iBase 
cc30: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
cc40: 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73 4f   int referencesO
cc50: 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45 78  therTables(.  Ex
cc60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
cc70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
cc80: 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  h expressions in
cc90: 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20 57   ths list */.  W
cca0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
ccb0: 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70 70  skSet,   /* Mapp
ccc0: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20  ing from tables 
ccd0: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
cce0: 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
ccf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 20            /* Be 
cd00: 73 65 61 72 63 68 69 6e 67 20 77 69 74 68 20 74  searching with t
cd10: 68 65 20 69 46 69 72 73 74 2d 74 68 20 65 78 70  he iFirst-th exp
cd20: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
cd30: 20 69 42 61 73 65 20 20 20 20 20 20 20 20 20 20   iBase          
cd40: 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
cd50: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
cd60: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  his table */.){.
cd70: 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65    Bitmask allowe
cd80: 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61  d = ~getMask(pMa
cd90: 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a 20  skSet, iBase);. 
cda0: 20 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c 70   while( iFirst<p
cdb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
cdc0: 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c     if( (exprTabl
cdd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
cde0: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
cdf0: 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77  ++].pExpr)&allow
ce00: 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ed)!=0 ){.      
ce10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ce20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ce30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
ce40: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
ce50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
ce60: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
ce70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
ce80: 74 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72  t.** for an expr
ce90: 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54  ession of type T
cea0: 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
ceb0: 66 65 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65  fers to the same
cec0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75   column and.** u
ced0: 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ses the same col
cee0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
cef0: 61 73 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63  as the iCol'th c
cf00: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
cf10: 49 64 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Idx..** Argument
cf20: 20 69 42 61 73 65 20 69 73 20 74 68 65 20 63 75   iBase is the cu
cf30: 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64  rsor number used
cf40: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
cf50: 68 61 74 20 70 49 64 78 20 72 65 66 65 72 73 0a  hat pIdx refers.
cf60: 2a 2a 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** to..**.** If 
cf70: 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
cf80: 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
cf90: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
cfa0: 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
cfb0: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
cfc0: 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
cfd0: 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
cfe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
cff0: 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
d000: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d020: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
d030: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
d040: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
d050: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d060: 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
d070: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
d0a0: 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
d0b0: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
d0c0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
d0f0: 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
d100: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
d130: 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
d140: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
d150: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
d160: 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
d170: 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
d180: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
d190: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d1a0: 45 78 70 72 20 2a 70 20 3d 20 70 4c 69 73 74 2d  Expr *p = pList-
d1b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d1c0: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
d1d0: 75 6d 6e 5b 69 43 6f 6c 5d 3d 3d 70 2d 3e 69 43  umn[iCol]==p->iC
d1e0: 6f 6c 75 6d 6e 20 26 26 20 69 42 61 73 65 3d 3d  olumn && iBase==
d1f0: 70 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  p->iTable ){.   
d200: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
d210: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
d220: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d230: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
d240: 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
d250: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
d260: 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Name, zColl) ){.
d270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
d280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d290: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31    }..  return -1
d2a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d2b0: 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d 69 6e  routine determin
d2c0: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
d2d0: 65 20 75 73 65 64 20 74 6f 20 61 73 73 69 73 74  e used to assist
d2e0: 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
d2f0: 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71 75 61  .** DISTINCT qua
d300: 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68 65 72  lifier. In other
d310: 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73 74 73   words, it tests
d320: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
d330: 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20 69 6e  using this.** in
d340: 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75 74 65  dex for the oute
d350: 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74 65 65  r loop guarantee
d360: 73 20 74 68 61 74 20 72 6f 77 73 20 77 69 74 68  s that rows with
d370: 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20 66 6f   equal values fo
d380: 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65 73 73  r.** all express
d390: 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44 69 73  ions in the pDis
d3a0: 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65 20 64  tinct list are d
d3b0: 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70 65 64  elivered grouped
d3c0: 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a   together..**.**
d3d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
d3e0: 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a 20 20  e query .**.**  
d3f0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
d400: 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62   a, b, c FROM tb
d410: 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a 2a 2a  l WHERE a = ?.**
d420: 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69 74 20  .** can benefit 
d430: 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78 20 6f  from any index o
d440: 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20 61 6e  n columns "b" an
d450: 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  d "c"..*/.static
d460: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 49   int isDistinctI
d470: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
d480: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d490: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d4a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d4b0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
d4c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d4d0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
d4e0: 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  use */.  Index *
d4f0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
d500: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d510: 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73  index being cons
d520: 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  idered */.  int 
d530: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
d540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d550: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
d560: 20 74 68 65 20 74 61 62 6c 65 20 70 49 64 78 20   the table pIdx 
d570: 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  is on */.  ExprL
d580: 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  ist *pDistinct, 
d590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d5a0: 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72 65  e DISTINCT expre
d5b0: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ssions */.  int 
d5c0: 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20 20 20  nEqCol          
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d5e0: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
d5f0: 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 2a  olumns with == *
d600: 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  /.){.  Bitmask m
d610: 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ask = 0;        
d620: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
d630: 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20 66 6f  f unaccounted fo
d640: 72 20 70 44 69 73 74 69 6e 63 74 20 65 78 70 72  r pDistinct expr
d650: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
d680: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
d690: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
d6a0: 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63  e==0 || pDistinc
d6b0: 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69 6e 63  t==0 || pDistinc
d6c0: 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20  t->nExpr>=BMS ) 
d6d0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
d6e0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
d6f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
d700: 20 69 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74   in the distinct
d710: 20 6c 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66   list. If any of
d720: 20 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e   them.  ** are n
d730: 6f 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e  ot simple column
d740: 20 72 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74   references, ret
d750: 75 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72  urn early. Other
d760: 77 69 73 65 2c 20 74 65 73 74 20 69 66 20 74 68  wise, test if th
d770: 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61  e.  ** WHERE cla
d780: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  use contains a "
d790: 63 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49  col=X" clause. I
d7a0: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65  f it does, the e
d7b0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63  xpression.  ** c
d7c0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49  an be ignored. I
d7d0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61  f it does not, a
d7e0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f  nd the column do
d7f0: 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f  es not belong to
d800: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74   the.  ** same t
d810: 61 62 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49  able as index pI
d820: 64 78 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  dx, return early
d830: 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  . Finally, if th
d840: 65 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d  ere is no.  ** m
d850: 61 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20  atching "col=X" 
d860: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74  expression and t
d870: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20  he column is on 
d880: 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61  the same table a
d890: 73 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74  s pIdx,.  ** set
d8a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d8b0: 6e 67 20 62 69 74 20 69 6e 20 76 61 72 69 61 62  ng bit in variab
d8c0: 6c 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  le mask..  */.  
d8d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
d8e0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
d8f0: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
d900: 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70   *pTerm;.    Exp
d910: 72 20 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74  r *p = pDistinct
d920: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
d930: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
d940: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
d950: 30 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  0;.    pTerm = f
d960: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e  indTerm(pWC, p->
d970: 69 54 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75  iTable, p->iColu
d980: 6d 6e 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c  mn, ~(Bitmask)0,
d990: 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20   WO_EQ, 0);.    
d9a0: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
d9b0: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
d9c0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
d9d0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20    CollSeq *p1 = 
d9e0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
d9f0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
da00: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
da10: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
da20: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20    CollSeq *p2 = 
da30: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
da40: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
da50: 20 20 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20       if( p1==p2 
da60: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
da70: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  }.    if( p->iTa
da80: 62 6c 65 21 3d 62 61 73 65 20 29 20 72 65 74 75  ble!=base ) retu
da90: 72 6e 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rn 0;.    mask |
daa0: 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20  = (((Bitmask)1) 
dab0: 3c 3c 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  << i);.  }..  fo
dac0: 72 28 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b  r(i=nEqCol; mask
dad0: 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && i<pIdx->nCol
dae0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
daf0: 6e 74 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49  nt iExpr = findI
db00: 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20  ndexCol(pParse, 
db10: 70 44 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c  pDistinct, base,
db20: 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69   pIdx, i);.    i
db30: 66 28 20 69 45 78 70 72 3c 30 20 29 20 62 72 65  f( iExpr<0 ) bre
db40: 61 6b 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20  ak;.    mask &= 
db50: 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c  ~(((Bitmask)1) <
db60: 3c 20 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  < iExpr);.  }.. 
db70: 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30   return (mask==0
db80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  );.}.../*.** Ret
db90: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
dba0: 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
dbb0: 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
dbc0: 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
dbd0: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
dbe0: 6e 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43  ndant. A DISTINC
dbf0: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
dc00: 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
dc10: 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ase contains a.*
dc20: 2a 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74  * UNIQUE index t
dc30: 68 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74  hat guarantees t
dc40: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hat the result o
dc50: 66 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  f the query will
dc60: 20 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20   be distinct.** 
dc70: 61 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  anyway..*/.stati
dc80: 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74  c int isDistinct
dc90: 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72  Redundant(.  Par
dca0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72  se *pParse,.  Sr
dcb0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
dcc0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
dcd0: 70 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  pWC,.  ExprList 
dce0: 2a 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20  *pDistinct.){.  
dcf0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
dd00: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
dd10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
dd30: 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f   int iBase;..  /
dd40: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f  * If there is mo
dd50: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c  re than one tabl
dd60: 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20  e or sub-select 
dd70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
dd80: 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  se of.  ** this 
dd90: 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77  query, then it w
dda0: 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
ddb0: 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  ble to show that
ddc0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20   the DISTINCT . 
ddd0: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65   ** clause is re
dde0: 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  dundant. */.  if
ddf0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
de00: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
de10: 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69    iBase = pTabLi
de20: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
de30: 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  ;.  pTab = pTabL
de40: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
de50: 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  /* If any of 
de60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
de70: 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e  is an IPK column
de80: 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c   on table iBase,
de90: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20   then return .  
dea0: 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54  ** true. Note: T
deb0: 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  he (p->iTable==i
dec0: 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68  Base) part of th
ded0: 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66  is test may be f
dee0: 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a  alse if the.  **
def0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
df00: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
df10: 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  sub-query..  */.
df20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69    for(i=0; i<pDi
df30: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69  stinct->nExpr; i
df40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
df50: 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b   = pDistinct->a[
df60: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
df70: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
df80: 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  MN && p->iTable=
df90: 3d 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f  =iBase && p->iCo
dfa0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
dfb0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  1;.  }..  /* Loo
dfc0: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e  p through all in
dfd0: 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dices on the tab
dfe0: 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63  le, checking eac
dff0: 68 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d  h to see if it m
e000: 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49  akes.  ** the DI
e010: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
e020: 20 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64   redundant. It d
e030: 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a  oes so if:.  **.
e040: 20 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e    **   1. The in
e050: 64 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e  dex is itself UN
e060: 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20  IQUE, and.  **. 
e070: 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20   **   2. All of 
e080: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
e090: 68 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74  he index are eit
e0a0: 68 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20  her part of the 
e0b0: 70 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20  pDistinct.  **  
e0c0: 20 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73      list, or els
e0d0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
e0e0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65  se contains a te
e0f0: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
e100: 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20  col=X",.  **    
e110: 20 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63    where X is a c
e120: 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54  onstant value. T
e130: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
e140: 75 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20  uences of the.  
e150: 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73  **      comparis
e160: 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69  on and select-li
e170: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  st expressions m
e180: 75 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20  ust match those 
e190: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  of the index..  
e1a0: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
e1b0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e1c0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e1d0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64  xt){.    if( pId
e1e0: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  x->onError==OE_N
e1f0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
e200: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e210: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
e220: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
e230: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
e240: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  umn[i];.      if
e250: 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57  ( 0==findTerm(pW
e260: 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20  C, iBase, iCol, 
e270: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
e280: 45 51 2c 20 70 49 64 78 29 20 0a 20 20 20 20 20  EQ, pIdx) .     
e290: 20 20 26 26 20 30 3e 66 69 6e 64 49 6e 64 65 78    && 0>findIndex
e2a0: 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73  Col(pParse, pDis
e2b0: 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49  tinct, iBase, pI
e2c0: 64 78 2c 20 69 29 0a 20 20 20 20 20 20 29 7b 0a  dx, i).      ){.
e2d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e2e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e2f0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
e300: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f  olumn ){.      /
e310: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
e320: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
e330: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
e340: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
e350: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
e360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
e370: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e380: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
e390: 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63  ecides if pIdx c
e3a0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61  an be used to sa
e3b0: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
e3c0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49  BY.** clause.  I
e3d0: 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74  f it can, it ret
e3e0: 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78  urns 1.  If pIdx
e3f0: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
e400: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
e410: 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75  clause, this rou
e420: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a  tine returns 0..
e430: 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69  **.** pOrderBy i
e440: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
e450: 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45  ause from a SELE
e460: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70  CT statement.  p
e470: 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65  Tab is the.** le
e480: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e  ft-most table in
e490: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e4a0: 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53 45   of that same SE
e4b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
e4c0: 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nd.** the table 
e4d0: 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  has a cursor num
e4e0: 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20  ber of "base".  
e4f0: 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78  pIdx is an index
e500: 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   on pTab..**.** 
e510: 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  nEqCol is the nu
e520: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
e530: 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72 65  of pIdx that are
e540: 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69 74   used as equalit
e550: 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73  y.** constraints
e560: 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20  .  Any of these 
e570: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d  columns may be m
e580: 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  issing from the 
e590: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
e5a0: 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68  se and the match
e5b0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20   can still be a 
e5c0: 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41  success..**.** A
e5d0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
e5e0: 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 6d 61  ORDER BY that ma
e5f0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
e600: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 69  index must be ei
e610: 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44  ther.** ASC or D
e620: 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20  ESC.  (Terms of 
e630: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
e640: 75 73 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  use past the end
e650: 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20   of a UNIQUE.** 
e660: 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65  index do not nee
e670: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69  d to satisfy thi
e680: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20  s constraint.)  
e690: 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65  The *pbRev value
e6a0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20   is.** set to 1 
e6b0: 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
e6c0: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45  clause is all DE
e6d0: 53 43 20 61 6e 64 20 69 74 20 69 73 20 73 65 74  SC and it is set
e6e0: 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20   to 0 if.** the 
e6f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e700: 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73  is all ASC..*/.s
e710: 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74  tatic int isSort
e720: 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ingIndex(.  Pars
e730: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e740: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e750: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e760: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
e770: 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  et, /* Mapping f
e780: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
e790: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
e7a0: 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  aps */.  Index *
e7b0: 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
e7c0: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
e7d0: 20 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a   are testing */.
e7e0: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
e800: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
e810: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  he table to be s
e820: 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  orted */.  ExprL
e830: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
e840: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
e850: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
e860: 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20  nt nEqCol,      
e870: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e880: 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   of index column
e890: 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72  s with == constr
e8a0: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 77  aints */.  int w
e8b0: 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
e8c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 61 67     /* Index usag
e8d0: 65 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  es flags */.  in
e8e0: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
e8f0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
e900: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
e910: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
e920: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e940: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
e950: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
e960: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
e970: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
e980: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
e990: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
e9a0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e9d0: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
e9e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
e9f0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
ea00: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
ea10: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
ea20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
ea30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ea40: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 21 70 4f  ->db;..  if( !pO
ea50: 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
ea60: 30 3b 0a 20 20 69 66 28 20 77 73 46 6c 61 67 73  0;.  if( wsFlags
ea70: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
ea80: 49 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  IN ) return 0;. 
ea90: 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
eaa0: 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30  dered ) return 0
eab0: 3b 0a 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  ;..  nTerm = pOr
eac0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
ead0: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
eae0: 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e  );..  /* Argumen
eaf0: 74 20 70 49 64 78 20 6d 75 73 74 20 65 69 74 68  t pIdx must eith
eb00: 65 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27 72  er point to a 'r
eb10: 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65 78  eal' named index
eb20: 20 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20 2a   structure, .  *
eb30: 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 74  * or an index st
eb40: 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65  ructure allocate
eb50: 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 62  d on the stack b
eb60: 79 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  y bestBtreeIndex
eb70: 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65  () to.  ** repre
eb80: 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 69  sent the rowid i
eb90: 6e 64 65 78 20 74 68 61 74 20 69 73 20 70 61 72  ndex that is par
eba0: 74 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c 65  t of every table
ebb0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ebc0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28  pIdx->zName || (
ebd0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
ebe0: 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75   && pIdx->aiColu
ebf0: 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20  mn[0]==-1) );.. 
ec00: 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20   /* Match terms 
ec10: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
ec20: 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63  clause against c
ec30: 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74  olumns of.  ** t
ec40: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
ec50: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e   ** Note that in
ec60: 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d  dices have pIdx-
ec70: 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72  >nColumn regular
ec80: 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20   columns plus.  
ec90: 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  ** one additiona
eca0: 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  l column contain
ecb0: 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20  ing the rowid.  
ecc0: 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  The rowid column
ecd0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  .  ** of the ind
ece0: 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77  ex is also allow
ecf0: 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  ed to match agai
ed00: 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  nst the ORDER BY
ed10: 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20  .  ** clause..  
ed20: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
ed30: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
ed40: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
ed50: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
ed60: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
ed70: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
ed80: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
ed90: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
eda0: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
edb0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
edc0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
edd0: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
ede0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
edf0: 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
ee00: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
ee10: 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69  is term */.    i
ee20: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
ee30: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f    /* The i-th co
ee40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
ee50: 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64  x.  -1 for rowid
ee60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72   */.    int iSor
ee70: 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20  tOrder;    /* 1 
ee80: 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20  for DESC, 0 for 
ee90: 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ASC on the i-th 
eea0: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20  index term */.  
eeb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
eec0: 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  oll; /* Name of 
eed0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
eee0: 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20  quence for i-th 
eef0: 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20  index term */.. 
ef00: 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d     pExpr = pTerm
ef10: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
ef20: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
ef30: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
ef40: 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a  iTable!=base ){.
ef50: 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74        /* Can not
ef60: 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f   use an index so
ef70: 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74  rt on anything t
ef80: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c  hat is not a col
ef90: 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  umn in the.     
efa0: 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61   ** left-most ta
efb0: 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ble of the FROM 
efc0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
efd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
efe0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
eff0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
f000: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
f010: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
f020: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
f030: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
f040: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a  .    if( pIdx->z
f050: 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e  Name && i<pIdx->
f060: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
f070: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d   iColumn = pIdx-
f080: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
f090: 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
f0a0: 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  =pIdx->pTable->i
f0b0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
f0c0: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
f0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72      }.      iSor
f0e0: 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61  tOrder = pIdx->a
f0f0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
f100: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78      zColl = pIdx
f110: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
f120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43   }else{.      iC
f130: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
f140: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30    iSortOrder = 0
f150: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
f160: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
f170: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70    }.    if( pExp
f180: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
f190: 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  umn || sqlite3St
f1a0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
f1b0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
f1c0: 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
f1d0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
f1e0: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
f1f0: 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
f200: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
f210: 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
f220: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
f230: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
f240: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
f250: 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
f260: 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
f270: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
f280: 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
f290: 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
f2a0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
f2b0: 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
f2c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
f2d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
f2e0: 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  e if( i==pIdx->n
f2f0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
f300: 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d    /* Index colum
f310: 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64  n i is the rowid
f320: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72  .  All other ter
f330: 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20  ms match. */.   
f340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f360: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
f370: 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
f380: 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
f390: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
f3a0: 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
f3b0: 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
f3c0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
f3d0: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
f3e0: 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
f3f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
f400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f410: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f420: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
f430: 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  || iColumn==-1 )
f440: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
f450: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
f460: 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74  0 || pTerm->sort
f470: 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20  Order==1 );.    
f480: 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64  assert( iSortOrd
f490: 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72  er==0 || iSortOr
f4a0: 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65  der==1 );.    te
f4b0: 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53  rmSortOrder = iS
f4c0: 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d  ortOrder ^ pTerm
f4d0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
f4e0: 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b   if( i>nEqCol ){
f4f0: 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53  .      if( termS
f500: 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72  ortOrder!=sortOr
f510: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  der ){.        /
f520: 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e  * Indices can on
f530: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  ly be used if al
f540: 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
f550: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20   past the.      
f560: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f    ** equality co
f570: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c  nstraints are al
f580: 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72  l either DESC or
f590: 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20   ASC. */.       
f5a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
f5b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
f5c0: 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
f5d0: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20  termSortOrder;. 
f5e0: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
f5f0: 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69    pTerm++;.    i
f600: 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  f( iColumn<0 && 
f610: 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72  !referencesOther
f620: 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c  Tables(pOrderBy,
f630: 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61   pMaskSet, j, ba
f640: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  se) ){.      /* 
f650: 49 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63  If the indexed c
f660: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69  olumn is the pri
f670: 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65  mary key and eve
f680: 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a  rything matches.
f690: 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20        ** so far 
f6a0: 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  and none of the 
f6b0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
f6c0: 6f 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65  o the right refe
f6d0: 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20  rence other.    
f6e0: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
f6f0: 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65  he join, then we
f700: 20 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61   are assured tha
f710: 74 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20  t the index can 
f720: 62 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a  be used .      *
f730: 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73  * to sort becaus
f740: 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  e the primary ke
f750: 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20  y is unique and 
f760: 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f  so none of the o
f770: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ther.      ** co
f780: 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20  lumns will make 
f790: 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20  any difference. 
f7a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20       */.      j 
f7b0: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = nTerm;.    }. 
f7c0: 20 7d 0a 0a 20 20 69 66 28 20 70 62 52 65 76 20   }..  if( pbRev 
f7d0: 29 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f  ) *pbRev = sortO
f7e0: 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a  rder!=0;.  if( j
f7f0: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f  >=nTerm ){.    /
f800: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
f810: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f820: 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  se are covered b
f830: 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a  y this index so.
f840: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65      ** this inde
f850: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
f860: 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  r sorting. */.  
f870: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
f880: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
f890: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
f8a0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
f8b0: 0a 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61  .      && (wsFla
f8c0: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
f8d0: 4e 5f 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  N_NULL)==0.     
f8e0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
f8f0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
f900: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
f910: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
f920: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
f930: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
f940: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
f950: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f960: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
f970: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
f980: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
f990: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
f9a0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
f9b0: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
f9c0: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
f9d0: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
f9e0: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
f9f0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
fa00: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
fa10: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
fa20: 20 4e 6f 74 20 74 68 61 74 20 69 66 20 74 68 65   Not that if the
fa30: 20 6d 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a   matching.    **
fa40: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53   condition is IS
fa50: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
fa60: 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63  esult is not nec
fa70: 65 73 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a  essarily unique.
fa80: 20 20 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61      ** even on a
fa90: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73   UNIQUE index, s
faa0: 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65  o disallow those
fab0: 20 63 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72   cases. */.    r
fac0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
fad0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fae0: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
faf0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
fb00: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
fb10: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
fb20: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
fb30: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
fb40: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
fb50: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
fb60: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
fb70: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
fb80: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ing operations w
fb90: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
fba0: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
fbb0: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
fbc0: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
fbd0: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
fbe0: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
fbf0: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
fc00: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
fc10: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
fc20: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
fc30: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
fc40: 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
fc50: 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
fc60: 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
fc70: 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
fc80: 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
fc90: 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
fca0: 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
fcb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
fcc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
fcd0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
fce0: 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
fcf0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
fd00: 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
fd10: 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
fd20: 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
fd30: 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
fd40: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
fd50: 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
fd60: 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
fd70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
fd80: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
fd90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
fda0: 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
fdb0: 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
fdc0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
fdd0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
fde0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
fdf0: 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
fe00: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
fe10: 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
fe20: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
fe30: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
fe40: 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
fe50: 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
fe60: 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
fe70: 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
fe80: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
fe90: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
fea0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
feb0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
fec0: 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
fed0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
fee0: 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
fef0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
ff00: 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
ff10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ff20: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
ff30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ff40: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
ff50: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
ff60: 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
ff70: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
ff80: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
ff90: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
ffa0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
ffb0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
ffc0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
ffd0: 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
ffe0: 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
fff0: 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
10000 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
10010 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
10020 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
10030 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
10040 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10050 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
10060 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
10070 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
10080 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
10090 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
100a0 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
100b0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
100c0 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
100d0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
100e0 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
100f0 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
10100 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
10110 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
10120 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
10130 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
10140 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
10150 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
10160 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
10170 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
10180 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10190 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
101a0 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
101b0 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
101c0 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
101d0 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
101e0 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
101f0 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
10200 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72  f../* .** Requir
10210 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49  ed because bestI
10220 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
10230 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65   by bestOrClause
10240 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74  Index() .*/.stat
10250 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
10260 78 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57  x(.    Parse*, W
10270 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72  hereClause*, str
10280 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10290 2a 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20  *,.    Bitmask, 
102a0 42 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73  Bitmask, ExprLis
102b0 74 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b  t*, WhereCost*);
102c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
102d0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
102e0 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
102f0 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
10300 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
10310 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
10320 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
10330 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
10340 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
10350 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10360 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10370 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10380 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
10390 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
103a0 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
103b0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
103c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
103d0 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
103e0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
103f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
10400 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10410 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
10420 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
10430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10440 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10450 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
10460 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
10470 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
10480 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
10490 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
104a0 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
104b0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
104c0 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
104d0 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
104e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
104f0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
10500 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
10510 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
10520 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
10530 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10540 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
10550 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10560 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
10570 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
10580 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
10590 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
105a0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
105b0 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
105c0 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69  ZATION.  const i
105d0 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
105e0 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
105f0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
10600 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
10610 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
10620 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20  Bitmask maskSrc 
10630 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
10640 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20  MaskSet, iCur); 
10650 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20   /* Bitmask for 
10660 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54  pSrc */.  WhereT
10670 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45  erm * const pWCE
10680 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
10690 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20  ->nTerm];       
106a0 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
106b0 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
106c0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
106d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
106e0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
106f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10700 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63  */..  /* No OR-c
10710 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  lause optimizati
10720 6f 6e 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68  on allowed if th
10730 65 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  e INDEXED BY or 
10740 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
10750 73 65 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65  ses.  ** are use
10760 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  d */.  if( pSrc-
10770 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70  >notIndexed || p
10780 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29  Src->pIndex!=0 )
10790 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
107a0 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74  }..  /* Search t
107b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
107c0 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62  terms for a usab
107d0 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a  le WO_OR term. *
107e0 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
107f0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
10800 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
10810 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
10820 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20  erator==WO_OR . 
10830 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e      && ((pTerm->
10840 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73  prereqAll & ~mas
10850 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79  kSrc) & notReady
10860 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
10870 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
10880 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b  indexable & mask
10890 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  Src)!=0 .    ){.
108a0 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
108b0 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
108c0 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
108d0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
108e0 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
108f0 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
10900 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
10910 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
10920 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
10930 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
10940 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
10950 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54  .      double rT
10960 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
10970 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b  double nRow = 0;
10980 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75  .      Bitmask u
10990 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  sed = 0;..      
109a0 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
109b0 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
109c0 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
109d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72  +){.        Wher
109e0 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b  eCost sTermCost;
109f0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
10a00 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d  ACE(("... Multi-
10a10 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67  index OR testing
10a20 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20   for term %d of 
10a30 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20  %d....\n", .    
10a40 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d        (pOrTerm -
10a50 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65   pOrWC->a), (pTe
10a60 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20  rm - pWC->a).   
10a70 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20       ));.       
10a80 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
10a90 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
10aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
10ab0 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
10ac0 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
10ad0 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
10ae0 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
10af0 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c  (pParse, pAndWC,
10b00 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
10b10 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73   notValid, 0, &s
10b20 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
10b30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72     }else if( pOr
10b40 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10b50 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==iCur ){.      
10b60 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
10b70 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
10b80 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20    tempWC.pParse 
10b90 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pWC->pParse;. 
10ba0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
10bb0 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e  pMaskSet = pWC->
10bc0 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20  pMaskSet;.      
10bd0 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
10be0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
10bf0 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72    tempWC.a = pOr
10c00 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
10c10 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
10c20 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
10c30 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74  Index(pParse, &t
10c40 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  empWC, pSrc, not
10c50 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
10c60 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
10c70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10c80 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
10c90 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
10ca0 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20        rTotal += 
10cb0 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b  sTermCost.rCost;
10cc0 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  .        nRow +=
10cd0 20 73 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e   sTermCost.plan.
10ce0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73  nRow;.        us
10cf0 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e  ed |= sTermCost.
10d00 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  used;.        if
10d10 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d  ( rTotal>=pCost-
10d20 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a  >rCost ) break;.
10d30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10d40 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
10d50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10d60 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
10d70 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f  can cost to acco
10d80 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  unt .      ** fo
10d90 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  r the cost of th
10da0 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20  e sort. */.     
10db0 20 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30   if( pOrderBy!=0
10dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52   ){.        WHER
10dd0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
10de0 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f  ting increases O
10df0 52 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25  R cost %.9g to %
10e00 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  .9g\n",.        
10e10 20 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74              rTot
10e20 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a  al, rTotal+nRow*
10e30 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a  estLog(nRow)));.
10e40 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b          rTotal +
10e50 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
10e60 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ow);.      }..  
10e70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10e80 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75  st of scanning u
10e90 73 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72  sing this OR ter
10ea0 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  m for optimizati
10eb0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  on is.      ** l
10ec0 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
10ed0 72 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64  rent cost stored
10ee0 20 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61   in pCost, repla
10ef0 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ce the contents.
10f00 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73        ** of pCos
10f10 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  t. */.      WHER
10f20 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c  ETRACE(("... mul
10f30 74 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74  ti-index OR cost
10f40 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c  =%.9g nrow=%.9g\
10f50 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77  n", rTotal, nRow
10f60 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54  ));.      if( rT
10f70 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73  otal<pCost->rCos
10f80 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  t ){.        pCo
10f90 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74  st->rCost = rTot
10fa0 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  al;.        pCos
10fb0 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a  t->used = used;.
10fc0 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
10fd0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  lan.nRow = nRow;
10fe0 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
10ff0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66  plan.wsFlags = f
11000 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43  lags;.        pC
11010 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72  ost->plan.u.pTer
11020 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
11030 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
11040 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11050 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
11060 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
11070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11080 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
11090 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
110a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
110b0 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
110c0 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
110d0 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
110e0 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
110f0 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
11100 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
11110 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
11120 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
11130 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
11140 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
11150 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
11160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11170 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
11180 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
11190 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
111a0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
111b0 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
111c0 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
111d0 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
111e0 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
111f0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
11200 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
11210 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
11220 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
11230 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
11240 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
11250 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
11260 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
11270 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
11280 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11290 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
112a0 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
112b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
112c0 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
112d0 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
112e0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
112f0 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
11300 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
11310 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
11320 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
11330 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
11340 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
11350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11360 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
11370 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
11380 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
11390 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
113a0 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
113b0 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
113c0 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
113d0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
113e0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
113f0 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
11400 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
11410 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
11420 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
11430 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
11440 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
11450 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
11460 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
11470 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
11480 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
11490 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
114a0 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
114b0 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
114c0 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
114d0 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
114e0 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
114f0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
11500 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11520 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
11530 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
11540 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
11550 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11560 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
11570 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
11580 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
11590 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
115a0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
115b0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
115c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
115d0 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
115e0 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
115f0 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
11600 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
11610 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
11620 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
11630 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20   */.){.  double 
11640 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20  nTableRow;      
11650 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
11660 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
11670 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
11680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11690 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f   /* log(nTableRo
116a0 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63  w) */.  double c
116b0 6f 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20  ostTempIdx;     
116c0 20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79      /* per-query
116d0 20 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61   cost of the tra
116e0 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
116f0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
11700 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
11710 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
11720 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
11730 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
11740 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
11750 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
11760 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c  C->a[] */.  Tabl
11770 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20  e *pTable;      
11780 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
11790 20 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e   tht might be in
117a0 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20  dexed */..  if( 
117b0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
117c0 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  op<=(double)1 ){
117d0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
117e0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 62 75 69   no point in bui
117f0 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74  lding an automat
11800 69 63 20 69 6e 64 65 78 20 66 6f 72 20 61 20 73  ic index for a s
11810 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20  ingle scan */.  
11820 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
11830 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
11840 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
11850 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b  AutoIndex)==0 ){
11860 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  .    /* Automati
11870 63 20 69 6e 64 69 63 65 73 20 61 72 65 20 64 69  c indices are di
11880 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69  sabled at run-ti
11890 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  me */.    return
118a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f  ;.  }.  if( (pCo
118b0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
118c0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
118d0 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a 20 20 20  LSCAN)!=0 ){.   
118e0 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68   /* We already h
118f0 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66  ave some kind of
11900 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f   index in use fo
11910 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f  r this query. */
11920 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11930 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
11940 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f  Indexed ){.    /
11950 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45  * The NOT INDEXE
11960 44 20 63 6c 61 75 73 65 20 61 70 70 65 61 72 73  D clause appears
11970 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a   in the SQL. */.
11980 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11990 20 20 69 66 28 20 70 53 72 63 2d 3e 69 73 43 6f    if( pSrc->isCo
119a0 72 72 65 6c 61 74 65 64 20 29 7b 0a 20 20 20 20  rrelated ){.    
119b0 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 69 73  /* The source is
119c0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
119d0 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e  b-query. No poin
119e0 74 20 69 6e 20 69 6e 64 65 78 69 6e 67 20 69 74  t in indexing it
119f0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
11a00 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
11a10 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
11a20 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20  op >= (double)1 
11a30 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53  );.  pTable = pS
11a40 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62  rc->pTab;.  nTab
11a50 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e  leRow = pTable->
11a60 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20  nRowEst;.  logN 
11a70 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52  = estLog(nTableR
11a80 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49  ow);.  costTempI
11a90 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61  dx = 2*logN*(nTa
11aa0 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e  bleRow/pParse->n
11ab0 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a  QueryLoop + 1);.
11ac0 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64    if( costTempId
11ad0 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  x>=pCost->rCost 
11ae0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
11af0 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20 74  st of creating t
11b00 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
11b10 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65 61  le would be grea
11b20 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ter than.    ** 
11b30 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74  doing the full t
11b40 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
11b50 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11b60 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
11b70 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  y equality compa
11b80 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20  rison term */.  
11b90 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
11ba0 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
11bb0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
11bc0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
11bd0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
11be0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
11bf0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
11c00 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
11c10 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11c20 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75  "auto-index redu
11c30 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e  ces cost from %.
11c40 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20  1f to %.1f\n",. 
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c     pCost->rCost,
11c70 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a   costTempIdx));.
11c80 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
11c90 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78  st = costTempIdx
11ca0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
11cb0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20  lan.nRow = logN 
11cc0 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  + 1;.      pCost
11cd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
11ce0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
11cf0 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  X;.      pCost->
11d00 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72  used = pTerm->pr
11d10 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
11d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11d30 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
11d40 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  ne bestAutomatic
11d50 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29  Index(A,B,C,D,E)
11d60 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65    /* no-op */.#e
11d70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11d80 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
11d90 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  DEX */...#ifndef
11da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11db0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
11dc0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11dd0 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
11de0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e Index object f
11df0 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  or an automatic 
11e00 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20  index.** and to 
11e10 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65  set up the Where
11e20 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65  Level object pLe
11e30 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  vel so that the 
11e40 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
11e50 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74  * makes use of t
11e60 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
11e70 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
11e80 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f  id constructAuto
11e90 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
11ea0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11ec0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
11ed0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11ee0 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
11ef0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11f00 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11f10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11f20 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
11f30 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
11f40 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69  o get the next i
11f50 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
11f60 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
11f70 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11f80 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
11f90 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
11fa0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
11fb0 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  *pLevel         
11fc0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e   /* Write new in
11fd0 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  dex here */.){. 
11fe0 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   int nColumn;   
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12000 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
12010 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75  s in the constru
12020 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cted index */.  
12030 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
12040 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
12050 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
12060 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
12070 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
12080 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
12090 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
120a0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  >a[] */.  int nB
120b0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
120c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
120d0 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66   memory needed f
120e0 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  or pIdx */.  Ind
120f0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
12100 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12110 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ct describing th
12120 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  e transient inde
12130 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
12160 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
12170 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12180 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74 3b 20   int regIsInit; 
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121a0 52 65 67 69 73 74 65 72 20 73 65 74 20 62 79 20  Register set by 
121b0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
121c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
121d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
121f0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
12200 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
12210 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12230 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
12240 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
12250 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
12260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
12270 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
12280 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
12290 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
122b0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
122c0 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
122d0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
122f0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
12300 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
12310 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
12340 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
12370 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
12380 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
12390 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
123a0 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
123b0 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
123c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
123d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
123e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
123f0 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
12400 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78  */.  Bitmask idx
12410 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
12420 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f   /* Bitmap of co
12430 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69  lumns used for i
12440 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
12450 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20  mask extraCols; 
12460 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
12470 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  ap of additional
12480 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f   columns */..  /
12490 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
124a0 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65  to skip over the
124b0 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e   creation and in
124c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
124d0 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65  the.  ** transie
124e0 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20  nt index on 2nd 
124f0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69  and subsequent i
12500 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  terations of the
12510 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20   loop. */.  v = 
12520 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12530 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12540 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d 20 2b  .  regIsInit = +
12550 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12560 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
12570 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12580 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49 6e 69   OP_If, regIsIni
12590 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
125a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
125b0 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49 73 49  teger, 1, regIsI
125c0 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  nit);..  /* Coun
125d0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
125e0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
125f0 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
12600 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
12610 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
12620 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
12630 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f  traints */.  nCo
12640 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62  lumn = 0;.  pTab
12650 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
12660 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
12670 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
12680 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
12690 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
126a0 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
126b0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
126c0 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
126d0 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
126e0 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
126f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
12700 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
12710 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
12720 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
12730 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
12740 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
12750 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
12760 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
12770 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
12780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12790 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
127a0 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
127b0 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
127c0 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  {.        nColum
127d0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78  n++;.        idx
127e0 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
127f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12800 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75  .  assert( nColu
12810 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  mn>0 );.  pLevel
12820 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f  ->plan.nEq = nCo
12830 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  lumn;..  /* Coun
12840 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12850 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12860 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
12870 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
12880 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
12890 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
128a0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
128b0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
128c0 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
128d0 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
128e0 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
128f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
12900 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
12910 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
12920 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
12930 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
12940 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
12950 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
12960 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
12970 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
12980 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
12990 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
129a0 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
129b0 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
129c0 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
129d0 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
129e0 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
129f0 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
12a00 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
12a10 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
12a20 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b  ols | (((Bitmask
12a30 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a  )1)<<(BMS-1)));.
12a40 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54    mxBitCol = (pT
12a50 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d  able->nCol >= BM
12a60 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70  S-1) ? BMS-1 : p
12a70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74  Table->nCol;.  t
12a80 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
12a90 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
12aa0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12ab0 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
12ac0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
12ad0 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
12ae0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
12af0 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
12b00 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b  )<<i) ) nColumn+
12b10 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
12b20 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28  c->colUsed & (((
12b30 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
12b40 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  -1)) ){.    nCol
12b50 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  umn += pTable->n
12b60 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
12b70 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   }.  pLevel->pla
12b80 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
12b90 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57  RE_COLUMN_EQ | W
12ba0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
12bb0 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  WO_EQ;..  /* Con
12bc0 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12bd0 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
12be0 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
12bf0 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  /.  nByte = size
12c00 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79  of(Index);.  nBy
12c10 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
12c20 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f  zeof(int);     /
12c30 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
12c40 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
12c50 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68  Column*sizeof(ch
12c60 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ar*);   /* Index
12c70 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79  .azColl */.  nBy
12c80 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20  te += nColumn;  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ca0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
12cb0 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  er */.  pIdx = s
12cc0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12cd0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
12ce0 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64  Byte);.  if( pId
12cf0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
12d00 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
12d10 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  pIdx = pIdx;.  p
12d20 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
12d30 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a  har**)&pIdx[1];.
12d40 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12d50 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e   = (int*)&pIdx->
12d60 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b  azColl[nColumn];
12d70 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
12d80 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78  der = (u8*)&pIdx
12d90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
12da0 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  mn];.  pIdx->zNa
12db0 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
12dc0 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ";.  pIdx->nColu
12dd0 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = nColumn;.  
12de0 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
12df0 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
12e00 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
12e10 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
12e20 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
12e30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
12e40 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
12e50 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
12e60 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
12e70 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
12e80 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
12e90 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
12ea0 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
12eb0 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
12ec0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
12ed0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
12ee0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  l;.      if( (id
12ef0 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12f00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
12f10 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
12f20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
12f30 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
12f40 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
12f50 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
12f60 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
12f70 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
12f80 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
12f90 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
12fa0 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
12fb0 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
12fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
12fd0 6c 6c 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ll!=0 || pParse-
12fe0 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20 20 20  >nErr>0 );.     
12ff0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
13000 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  n] = pColl ? pCo
13010 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e  ll->zName : "BIN
13020 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ARY";.        n+
13030 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
13040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
13050 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70  u32)n==pLevel->p
13060 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a  lan.nEq );..  /*
13070 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20   Add additional 
13080 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
13090 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d  o make the autom
130a0 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a  atic index into.
130b0 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20    ** a covering 
130c0 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69  index */.  for(i
130d0 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
130e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
130f0 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
13100 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20  mask)1)<<i) ){. 
13110 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
13120 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[n] = i;.    
13130 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
13140 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
13150 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
13160 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63   }.  if( pSrc->c
13170 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74 6d  olUsed & (((Bitm
13180 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
13190 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
131a0 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
131b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
131c0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
131d0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
131e0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
131f0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
13200 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
13210 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c   assert( n==nCol
13220 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65  umn );..  /* Cre
13230 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ate the automati
13240 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65  c index */.  pKe
13250 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yinfo = sqlite3I
13260 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
13270 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73  se, pIdx);.  ass
13280 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert( pLevel->iId
13290 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c  xCur>=0 );.  sql
132a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
132b0 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
132c0 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
132d0 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20  Cur, nColumn+1, 
132e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
132f0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13300 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyinfo, P4_KEYIN
13310 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56  FO_HANDOFF);.  V
13320 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13330 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
13340 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
13350 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
13360 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
13370 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
13380 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
13390 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
133a0 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
133b0 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f  bCur);.  regReco
133c0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
133d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
133e0 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
133f0 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
13400 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
13410 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
13420 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
13430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13440 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
13450 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
13460 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
13470 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
13480 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
13490 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
134a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
134b0 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
134c0 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
134d0 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  op+1);.  sqlite3
134e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
134f0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
13500 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20  S_AUTOINDEX);.  
13510 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13520 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  ere(v, addrTop);
13530 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
13540 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13550 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a   regRecord);.  .
13560 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
13570 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65  hen skipping the
13580 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
13590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
135a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
135b0 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Init);.}.#endif 
135c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
135d0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
135e0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
135f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13600 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  BLE./*.** Alloca
13610 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  te and populate 
13620 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  an sqlite3_index
13630 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
13640 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
13650 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
13660 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
13670 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
13680 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
13690 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74 68  ** by passing th
136a0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
136b0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
136c0 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66  ion to sqlite3_f
136d0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
136e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
136f0 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64  nfo *allocateInd
13700 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20  exInfo(.  Parse 
13710 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72  *pParse, .  Wher
13720 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
13730 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
13740 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
13750 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
13760 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
13770 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
13780 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13790 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
137a0 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
137b0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
137c0 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
137d0 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
137e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
137f0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
13800 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
13810 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
13820 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
13830 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13840 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48  *pIdxInfo;..  WH
13850 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d  ERETRACE(("Recom
13860 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66  puting index inf
13870 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20  o for %s...\n", 
13880 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
13890 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  e));..  /* Count
138a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
138b0 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c  ossible WHERE cl
138c0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
138d0 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20   referring.  ** 
138e0 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
138f0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
13900 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d  =nTerm=0, pTerm=
13910 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
13920 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
13930 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
13940 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21  rm->leftCursor !
13950 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  = pSrc->iCursor 
13960 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13970 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
13980 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d  eOperator&(pTerm
13990 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d  ->eOperator-1))=
139a0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
139b0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
139c0 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20  ator==WO_IN );. 
139d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
139e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
139f0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
13a00 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
13a10 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
13a20 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
13a30 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  nue;.    nTerm++
13a40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
13a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13a60 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
13a70 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
13a80 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
13a90 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
13aa0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
13ab0 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
13ac0 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
13ad0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13ae0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
13af0 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
13b00 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
13b10 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rBy ){.    for(i
13b20 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
13b30 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13b40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
13b50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13b60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
13b70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
13b80 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
13b90 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
13ba0 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
13bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
13bc0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
13bd0 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
13be0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
13bf0 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  xpr;.    }.  }..
13c00 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
13c10 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13c20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
13c30 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
13c40 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13c50 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
13c60 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66   sizeof(*pIdxInf
13c70 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o).             
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13c90 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
13ca0 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
13cb0 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
13ce0 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f  *pIdxOrderBy)*nO
13cf0 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20  rderBy );.  if( 
13d00 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
13d10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13d20 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
13d30 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
13d40 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
13d50 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
13d60 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
13d70 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65  INT... */.    re
13d80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
13d90 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
13da0 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
13db0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13dc0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
13dd0 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79  ntains.  ** many
13de0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72 65   fields that are
13df0 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74   declared "const
13e00 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65  " to prevent xBe
13e10 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a  stIndex from.  *
13e20 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
13e30 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
13e40 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
13e50 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
13e60 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   ** initialize t
13e70 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a  hose fields..  *
13e80 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28  /.  pIdxCons = (
13e90 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13ea0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
13eb0 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
13ec0 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
13ed0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13ee0 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
13ef0 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
13f00 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
13f10 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13f20 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13f30 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
13f40 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69  nOrderBy];.  *(i
13f50 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
13f60 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
13f70 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  rm;.  *(int*)&pI
13f80 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
13f90 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a   = nOrderBy;.  *
13fa0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
13fb0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
13fc0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
13fd0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
13fe0 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74  Cons;.  *(struct
13ff0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
14000 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e  rderby**)&pIdxIn
14010 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70  fo->aOrderBy = p
14020 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28  IdxOrderBy;.  *(
14030 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14040 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
14050 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66  usage**)&pIdxInf
14060 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
14070 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
140c0 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  ..  for(i=j=0, p
140d0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
140e0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
140f0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
14100 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
14110 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
14120 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
14130 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
14140 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
14150 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14160 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
14170 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
14180 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
14190 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
141a0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
141b0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
141c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
141d0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
141e0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
141f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
14200 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
14210 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
14220 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
14230 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
14240 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49  fset = i;.    pI
14250 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28  dxCons[j].op = (
14260 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  u8)pTerm->eOpera
14270 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  tor;.    /* The 
14280 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
14290 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
142a0 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
142b0 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
142c0 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61      ** the WO_ a
142d0 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
142e0 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65  CONSTRAINT_ code
142f0 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  s are identical.
14300 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c    The.    ** fol
14310 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
14320 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
14330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14340 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_EQ==SQLITE_IN
14350 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
14360 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
14370 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
14380 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14390 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LT );.    assert
143a0 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
143b0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
143c0 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
143d0 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
143e0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
143f0 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_GT );.    asse
14400 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54  rt( WO_GE==SQLIT
14410 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
14420 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_GE );.    ass
14430 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
14440 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14450 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
14460 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
14470 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
14480 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_EQ|WO_LT|WO_L
14490 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f  E|WO_GT|WO_GE|WO
144a0 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a  _MATCH) );.    j
144b0 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
144c0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
144d0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
144e0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
144f0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
14500 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
14510 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
14520 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  >iColumn;.    pI
14530 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
14540 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
14550 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
14560 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  }..  return pIdx
14570 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Info;.}../*.** T
14580 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  he table object 
14590 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65 64  reference passed
145a0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
145b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
145c0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
145d0 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69 72   represent a vir
145e0 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73  tual table. This
145f0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
14600 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  s the xBestIndex
14610 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
14620 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
14630 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69 74  e with the sqlit
14640 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f  e3_index_info po
14650 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  inter passed.** 
14660 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  as the argument.
14670 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14680 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73  or occurs, pPars
14690 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  e is populated w
146a0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ith an error mes
146b0 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  sage and a.** no
146c0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
146d0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
146e0 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
146f0 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ed and the outpu
14700 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65  t.** part of the
14710 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14720 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
14730 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e   left populated.
14740 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
14750 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69  r not an error i
14760 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69  s returned, it i
14770 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14780 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
14790 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
147a0 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53  lly free p->idxS
147b0 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46  tr if p->needToF
147c0 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61  reeIdxStr indica
147d0 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  tes.** that this
147e0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
147f0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62  .static int vtab
14800 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20  BestIndex(Parse 
14810 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
14820 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pTab, sqlite3_in
14830 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
14840 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
14850 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
14860 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  VTable(pParse->d
14870 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b  b, pTab)->pVtab;
14880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14890 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43  rc;..  WHERETRAC
148a0 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20 66  E(("xBestIndex f
148b0 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e  or %s\n", pTab->
148c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45  zName));.  TRACE
148d0 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a  _IDX_INPUTS(p);.
148e0 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d    rc = pVtab->pM
148f0 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
14900 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54  x(pVtab, p);.  T
14910 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
14920 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  (p);..  if( rc!=
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14950 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
14960 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
14970 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
14980 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
14990 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
149a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
149b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
149c0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
149d0 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
149e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
149f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14a00 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
14a10 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
14a20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14a30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
14a40 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
14a50 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
14a60 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
14a70 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
14a80 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  ( !p->aConstrain
14a90 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70  t[i].usable && p
14aa0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
14ab0 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
14ac0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14ad0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14ae0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
14af0 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
14b00 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
14b10 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
14b20 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14b30 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
14b40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d   pParse->nErr;.}
14b50 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
14b60 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
14b70 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61  for a virtual ta
14b80 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ble..**.** The b
14b90 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d  est index is com
14ba0 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65  puted by the xBe
14bb0 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f  stIndex method o
14bc0 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  f the virtual.**
14bd0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20   table module.  
14be0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14bf0 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72  really just a wr
14c00 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20  apper that sets 
14c10 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  up.** the sqlite
14c20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14c30 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75  ucture that is u
14c40 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61  sed to communica
14c50 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74  te with.** xBest
14c60 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  Index..**.** In 
14c70 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75  a join, this rou
14c80 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61  tine might be ca
14c90 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  lled multiple ti
14ca0 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  mes for the.** s
14cb0 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ame virtual tabl
14cc0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
14cd0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14ce0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a  ture is created.
14cf0 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
14d00 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ed on the first 
14d10 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72  invocation and r
14d20 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62  eused on all sub
14d30 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63  sequent.** invoc
14d40 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c  ations.  The sql
14d50 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14d60 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73  structure is als
14d70 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63  o used when.** c
14d80 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
14d90 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76   to access the v
14da0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
14db0 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65  he whereInfoDele
14dc0 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  te() .** routine
14dd0 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66   takes care of f
14de0 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74  reeing the sqlit
14df0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14e00 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a  ructure after.**
14e10 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66   everybody has f
14e20 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e  inished with it.
14e30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14e40 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
14e50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14e60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14e70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
14e80 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14e90 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
14ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14eb0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14ec0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
14ed0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14ee0 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc,      /* The 
14ef0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
14f00 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
14f10 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
14f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f30 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
14f40 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
14f50 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
14f60 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
14f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f80 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 76  /* Cursors not v
14f90 61 6c 69 64 20 66 6f 72 20 61 6e 79 20 70 75 72  alid for any pur
14fa0 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
14fb0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
14fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14fd0 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
14fe0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
14ff0 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20 20 20  *pCost,         
15000 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
15010 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
15020 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  */.  sqlite3_ind
15030 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49  ex_info **ppIdxI
15040 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e  nfo  /* Index in
15050 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
15060 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a   to xBestIndex *
15070 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
15080 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
15090 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
150a0 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
150b0 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
150c0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
150d0 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
150e0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
150f0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
15100 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
15110 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
15120 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
15130 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
15140 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a   double rCost;..
15150 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
15160 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61  sFlags is initia
15170 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61  lized to some sa
15180 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77  ne value. Otherw
15190 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a  ise, if the .  *
151a0 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f  * malloc in allo
151b0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20  cateIndexInfo() 
151c0 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66  fails and this f
151d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
151e0 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46  leaving.  ** wsF
151f0 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69  lags in an unini
15200 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20  tialized state, 
15210 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62  the caller may b
15220 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74 61  ehave unpredicta
15230 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  bly..  */.  mems
15240 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a  et(pCost, 0, siz
15250 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20  eof(*pCost));.  
15260 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
15270 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
15280 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20  UALTABLE;..  /* 
15290 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
152a0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
152b0 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
152c0 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
152d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
152e0 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
152f0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   allocate and in
15300 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e  itialize it now.
15310 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
15320 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
15330 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
15340 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78 49 6e   ){.    *ppIdxIn
15350 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20  fo = pIdxInfo = 
15360 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
15370 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  o(pParse, pWC, p
15380 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  Src, pOrderBy);.
15390 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e    }.  if( pIdxIn
153a0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  fo==0 ){.    ret
153b0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  urn;.  }..  /* A
153c0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
153d0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
153e0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  info structure t
153f0 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69  hat pIdxInfo poi
15400 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c  nts.  ** to will
15410 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69   have been initi
15420 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64  alized, either d
15430 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
15440 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a  t invocation or.
15450 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65    ** during some
15460 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f   prior invocatio
15470 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20  n.  Now we just 
15480 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a  have to customiz
15490 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69  e the.  ** detai
154a0 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66  ls of pIdxInfo f
154b0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  or the current i
154c0 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  nvocation and pa
154d0 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42  ss it to.  ** xB
154e0 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a  estIndex..  */..
154f0 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20    /* The module 
15500 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66  name must be def
15510 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74  ined. Also, by t
15520 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
15530 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70  must.  ** be a p
15540 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
15550 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
15560 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  ure. Otherwise. 
15570 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47   ** sqlite3ViewG
15580 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
15590 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65  would have picke
155a0 64 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20  d up the error. 
155b0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
155c0 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
155d0 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  g && pTab->azMod
155e0 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61  uleArg[0] );.  a
155f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 65  ssert( sqlite3Ge
15600 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
15610 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20  db, pTab) );..  
15620 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73  /* Set the aCons
15630 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
15640 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69  fields and initi
15650 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20  alize all .  ** 
15660 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
15670 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
15680 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b   ** aConstraint[
15690 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65  ].usable is true
156a0 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
156b0 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74   where the right
156c0 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20  -hand.  ** side 
156d0 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65  contains only re
156e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
156f0 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
15700 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  f the current.  
15710 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ** table.  In ot
15720 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
15730 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
15740 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
15750 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
15760 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20   column = expr. 
15770 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20   **.  ** and we 
15780 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61  are evaluating a
15790 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
157a0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f  constraint on co
157b0 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e  lumn is .  ** on
157c0 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20  ly valid if all 
157d0 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
157e0 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20  d in expr occur 
157f0 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a  to the left.  **
15800 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
15810 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e  ntaining column.
15820 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61  .  **.  ** The a
15830 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72  Constraints[] ar
15840 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ray contains ent
15850 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e  ries for all con
15860 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e  straints.  ** on
15870 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
15880 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65  le.  That way we
15890 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f   only have to co
158a0 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20  mpute it once.  
158b0 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77  ** even though w
158c0 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70  e might try to p
158d0 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64  ick the best ind
158e0 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ex multiple time
158f0 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68  s..  ** For each
15900 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b   attempt at pick
15910 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68  ing an index, th
15920 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  e order of table
15930 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  s in the.  ** jo
15940 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66  in might be diff
15950 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65  erent so we have
15960 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15970 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20  e usable flag.  
15980 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  ** each time..  
15990 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
159a0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
159b0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
159c0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
159d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55  Constraint;.  pU
159e0 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d  sage = pIdxInfo-
159f0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
15a00 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
15a10 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
15a20 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
15a30 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d  Cons++){.    j =
15a40 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
15a50 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72  Offset;.    pTer
15a60 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
15a70 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
15a80 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70  able = (pTerm->p
15a90 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74 52 65  rereqRight&notRe
15aa0 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20  ady) ? 0 : 1;.  
15ab0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
15ac0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
15ad0 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
15ae0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
15af0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
15b00 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
15b10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15b20 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
15b30 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
15b40 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
15b50 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
15b60 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
15b70 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
15b80 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
15b90 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
15ba0 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
15bb0 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20   /* ((double)2) 
15bc0 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
15bd0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
15be0 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49  POINT... */.  pI
15bf0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
15c00 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
15c10 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c  IG_DBL / ((doubl
15c20 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  e)2);.  nOrderBy
15c30 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   = pIdxInfo->nOr
15c40 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70 4f  derBy;.  if( !pO
15c50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 49  rderBy ){.    pI
15c60 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
15c70 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
15c80 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70   vtabBestIndex(p
15c90 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64  Parse, pTab, pId
15ca0 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72 65  xInfo) ){.    re
15cb0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64  turn;.  }..  pId
15cc0 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
15cd0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
15ce0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
15cf0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15d00 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
15d10 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
15d20 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
15d30 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e    if( pUsage[i].
15d40 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
15d50 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64       pCost->used
15d60 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43   |= pWC->a[pIdxC
15d70 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[i].iTermOffs
15d80 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b  et].prereqRight;
15d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15da0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
15db0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15dc0 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65   and the selecte
15dd0 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
15de0 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20  index.  ** does 
15df0 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c 20  not satisfy it, 
15e00 69 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f 73  increase the cos
15e10 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63  t of the scan ac
15e20 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a  cordingly. This.
15e30 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65    ** matches the
15e40 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
15e50 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c  non-virtual tabl
15e60 65 73 20 69 6e 20 62 65 73 74 42 74 72 65 65 49  es in bestBtreeI
15e70 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72  ndex()..  */.  r
15e80 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d  Cost = pIdxInfo-
15e90 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
15ea0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
15eb0 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  & pIdxInfo->orde
15ec0 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29  rByConsumed==0 )
15ed0 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20 65  {.    rCost += e
15ee0 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f  stLog(rCost)*rCo
15ef0 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  st;.  }..  /* Th
15f00 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c  e cost is not al
15f10 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67  lowed to be larg
15f20 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
15f30 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a  IG_DBL (the.  **
15f40 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66   inital value of
15f50 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74   lowestCost in t
15f60 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20  his loop. If it 
15f70 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  is, then the.  *
15f80 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  * (cost<lowestCo
15f90 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77  st) test below w
15fa0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75  ill never be tru
15fb0 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73  e..  ** .  ** Us
15fc0 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e  e "(double)2" in
15fd0 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69  stead of "2.0" i
15fe0 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41  n case OMIT_FLOA
15ff0 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a  TING_POINT .  **
16000 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a   is defined..  *
16010 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f  /.  if( (SQLITE_
16020 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
16030 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20  )2))<rCost ){.  
16040 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
16050 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
16060 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20  /((double)2));. 
16070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73   }else{.    pCos
16080 74 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74  t->rCost = rCost
16090 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
160a0 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d  lan.u.pVtabIdx =
160b0 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28   pIdxInfo;.  if(
160c0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
160d0 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
160e0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
160f0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
16100 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43  RDERBY;.  }.  pC
16110 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
16120 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  0;.  pIdxInfo->n
16130 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
16140 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  By;..  /* Try to
16150 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66   find a more eff
16160 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70 61  icient access pa
16170 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d  ttern by using m
16180 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a  ultiple indexes.
16190 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65    ** to optimize
161a0 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f   an OR expressio
161b0 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45  n within the WHE
161c0 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f  RE clause. .  */
161d0 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  .  bestOrClauseI
161e0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
161f0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
16200 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64  , notValid, pOrd
16210 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a  erBy, pCost);.}.
16220 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16230 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
16240 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
16250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16260 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  3./*.** Estimate
16270 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
16280 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65   a particular ke
16290 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73  y among all keys
162a0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   in an.** index.
162b0 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75    Store the resu
162c0 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20  lts in aStat as 
162d0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
162e0 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20    aStat[0]      
162f0 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72  Est. number of r
16300 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56  ows less than pV
16310 61 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31  al.**    aStat[1
16320 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
16330 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c  er of rows equal
16340 20 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52   to pVal.**.** R
16350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
16360 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
16370 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b  tatic int whereK
16380 65 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65  eyStats(.  Parse
16390 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
163a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
163b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
163c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
163e0 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69  * Index to consi
163f0 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f  der domain of */
16400 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
16410 20 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f   *pVal,        /
16420 2a 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69  * Value to consi
16430 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75  der */.  int rou
16440 6e 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20  ndUp,           
16450 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70       /* Round up
16460 20 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64   if true.  Round
16470 20 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a   down if false *
16480 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74  /.  tRowcnt *aSt
16490 61 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  at              
164a0 2f 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72  /* OUT: stats wr
164b0 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
164c0 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20  .  tRowcnt n;.  
164d0 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
164e0 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65  mple;.  int i, e
164f0 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71  Type;.  int isEq
16500 20 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20   = 0;.  i64 v;. 
16510 20 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a   double r, rS;..
16520 20 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55    assert( roundU
16530 70 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d  p==0 || roundUp=
16540 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  =1 );.  if( pVal
16550 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
16560 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 6e 20 3d  ITE_ERROR;.  n =
16570 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b   pIdx->aiRowEst[
16580 30 5d 3b 0a 20 20 61 53 61 6d 70 6c 65 20 3d 20  0];.  aSample = 
16590 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
165a0 20 69 20 3d 20 30 3b 0a 20 20 65 54 79 70 65 20   i = 0;.  eType 
165b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
165c0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 69  type(pVal);..  i
165d0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
165e0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
165f0 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
16600 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 20  e_int64(pVal);. 
16610 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b 0a 20     r = (i64)v;. 
16620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
16630 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
16640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  ){.      if( aSa
16650 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
16660 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e  QLITE_NULL ) con
16670 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
16680 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16690 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  e>=SQLITE_TEXT )
166a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
166b0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
166c0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  pe==SQLITE_INTEG
166d0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ER ){.        if
166e0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 69  ( aSample[i].u.i
166f0 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=v ){.         
16700 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b   isEq = aSample[
16710 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20 20 20  i].u.i==v;.     
16720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16730 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16740 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16750 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  t( aSample[i].eT
16760 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
16770 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16780 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e   aSample[i].u.r>
16790 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
167a0 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65 5b 69  isEq = aSample[i
167b0 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20 20 20  ].u.r==r;.      
167c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
167d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
167e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
167f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16800 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20 73 71  AT ){.    r = sq
16810 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
16820 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 66 6f  le(pVal);.    fo
16830 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
16840 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16850 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16860 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  i].eType==SQLITE
16870 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  _NULL ) continue
16880 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d  ;.      if( aSam
16890 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
168a0 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
168b0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 61  k;.      if( aSa
168c0 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53  mple[i].eType==S
168d0 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
168e0 20 20 20 20 20 20 20 72 53 20 3d 20 61 53 61 6d         rS = aSam
168f0 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20 20 20  ple[i].u.r;.    
16900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16910 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d   rS = aSample[i]
16920 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  .u.i;.      }.  
16930 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20 29 7b      if( rS>=r ){
16940 0a 20 20 20 20 20 20 20 20 69 73 45 71 20 3d 20  .        isEq = 
16950 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20 20 62  rS==r;.        b
16960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16970 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16980 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16990 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b  LL ){.    i = 0;
169a0 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  .    if( pIdx->n
169b0 53 61 6d 70 6c 65 3e 3d 31 20 26 26 20 61 53 61  Sample>=1 && aSa
169c0 6d 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53  mple[0].eType==S
169d0 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45  QLITE_NULL ) isE
169e0 71 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 1;.  }else{.
169f0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
16a00 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e==SQLITE_TEXT |
16a10 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
16a20 42 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28  BLOB );.    for(
16a30 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  i=0; i<pIdx->nSa
16a40 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
16a50 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
16a60 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54  .eType==SQLITE_T
16a70 45 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69  EXT || aSample[i
16a80 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
16a90 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20  BLOB ){.        
16aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16ab0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
16ac0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20  Idx->nSample ){ 
16ad0 20 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69       .      sqli
16ae0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16af0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ->db;.      Coll
16b00 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
16b10 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20    const u8 *z;. 
16b20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16b30 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20  SQLITE_BLOB ){. 
16b40 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73         z = (cons
16b50 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76  t u8 *)sqlite3_v
16b60 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b  alue_blob(pVal);
16b70 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
16b80 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
16b90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16ba0 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pColl->enc==SQLI
16bb0 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20  TE_UTF8 );.     
16bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16bd0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
16be0 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  etCollSeq(db, SQ
16bf0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70  LITE_UTF8, 0, *p
16c00 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20  Idx->azColl);.  
16c10 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
16c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16c30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16c40 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
16c50 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16c60 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  nce: %s",.      
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c80 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c      *pIdx->azCol
16c90 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  l);.          re
16ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
16cb0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16cc0 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16cd0 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75  u8 *)sqlite3Valu
16ce0 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c  eText(pVal, pCol
16cf0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20  l->enc);.       
16d00 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20   if( !z ){.     
16d10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16d20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
16d30 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16d40 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26  rt( z && pColl &
16d50 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b  & pColl->xCmp );
16d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
16d70 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42   = sqlite3ValueB
16d80 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c  ytes(pVal, pColl
16d90 2d 3e 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20  ->enc);.  .     
16da0 20 66 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e   for(; i<pIdx->n
16db0 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20  Sample; i++){.  
16dc0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
16dd0 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65       int eSample
16de0 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69  type = aSample[i
16df0 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].eType;.       
16e00 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
16e10 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75  <eType ) continu
16e20 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
16e30 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70  Sampletype!=eTyp
16e40 65 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64  e ) break;.#ifnd
16e50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16e60 54 46 31 36 0a 20 20 20 20 20 20 20 20 69 66 28  TF16.        if(
16e70 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c   pColl->enc!=SQL
16e80 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
16e90 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c        int nSampl
16ea0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  e;.          cha
16eb0 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c  r *zSample = sql
16ec0 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20  ite3Utf8to16(.  
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20              db, 
16ee0 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d  pColl->enc, aSam
16ef0 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d  ple[i].u.z, aSam
16f00 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e  ple[i].nByte, &n
16f10 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20  Sample.         
16f20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
16f30 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ( !zSample ){.  
16f40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16f50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
16f60 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
16f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
16f90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
16fa0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
16fb0 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70  ll->pUser, nSamp
16fc0 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20  le, zSample, n, 
16fd0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  z);.          sq
16fe0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16ff0 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20  zSample);.      
17000 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
17010 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
17020 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43     c = pColl->xC
17030 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
17040 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74   aSample[i].nByt
17050 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  e, aSample[i].u.
17060 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20  z, n, z);.      
17070 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17080 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
17090 20 20 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45    if( c==0 ) isE
170a0 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  q = 1;.         
170b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
170c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
170d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
170e0 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65  s point, aSample
170f0 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
17100 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
17110 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a  greater than.  *
17120 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56  * or equal to pV
17130 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49  al.  Or if i==pI
17140 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65  dx->nSample, the
17150 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72  n all samples ar
17160 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  e less.  ** than
17170 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70   pVal.  If aSamp
17180 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65  le[i]==pVal, the
17190 6e 20 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a  n isEq==1..  */.
171a0 20 20 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20    if( isEq ){.  
171b0 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 64 78    assert( i<pIdx
171c0 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20  ->nSample );.   
171d0 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d   aStat[0] = aSam
171e0 70 6c 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20  ple[i].nLt;.    
171f0 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
17200 6c 65 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c  le[i].nEq;.  }el
17210 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
17220 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20  iLower, iUpper, 
17230 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d  iGap;.    if( i=
17240 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
17250 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
17260 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30  pper = aSample[0
17270 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ].nLt;.    }else
17280 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
17290 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i>=pIdx->nSampl
172a0 65 20 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b  e ? n : aSample[
172b0 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c  i].nLt;.      iL
172c0 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  ower = aSample[i
172d0 2d 31 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c  -1].nEq + aSampl
172e0 65 5b 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20  e[i-1].nLt;.    
172f0 7d 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d  }.    aStat[1] =
17300 20 70 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20   pIdx->avgEq;.  
17310 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55    if( iLower>=iU
17320 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47  pper ){.      iG
17330 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ap = 0;.    }els
17340 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
17350 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b  iUpper - iLower;
17360 0a 20 20 20 20 20 20 69 66 28 20 69 47 61 70 3e  .      if( iGap>
17370 3d 61 53 74 61 74 5b 31 5d 2f 32 20 29 20 69 47  =aStat[1]/2 ) iG
17380 61 70 20 2d 3d 20 61 53 74 61 74 5b 31 5d 2f 32  ap -= aStat[1]/2
17390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
173a0 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
173b0 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
173c0 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
173d0 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
173e0 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
173f0 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
17400 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65  + iGap;.  }.  re
17410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17420 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
17430 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20  TE_ENABLE_STAT3 
17440 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70  */../*.** If exp
17450 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72 65  ression pExpr re
17460 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65 72  presents a liter
17470 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a 70  al value, set *p
17480 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  p to point to.**
17490 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
174a0 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
174b0 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65 20  aining the same 
174c0 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66 69  value, with affi
174d0 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c  nity.** aff appl
174e0 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f 72  ied to it, befor
174f0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74 20  e returning. It 
17500 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
17510 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a  ility of the .**
17520 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
17530 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
17540 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79 20  is structure by 
17550 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a  passing it to .*
17560 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  * sqlite3ValueFr
17570 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ee()..**.** If t
17580 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73 65  he current parse
17590 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65 20   is a recompile 
175a0 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61 72  (sqlite3Reprepar
175b0 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a 2a  e()) and pExpr.*
175c0 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72 69  * is an SQL vari
175d0 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65 6e  able that curren
175e0 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55  tly has a non-NU
175f0 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20 74  LL value bound t
17600 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20  o it,.** create 
17610 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
17620 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
17630 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75 65  ining this value
17640 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20  , again with.** 
17650 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70 70  affinity aff app
17660 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73 74  lied to it, inst
17670 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ead..**.** If ne
17680 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62 6f  ither of the abo
17690 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a 70  ve apply, set *p
176a0 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  p to NULL..**.**
176b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
176c0 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
176d0 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
176e0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
176f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
17700 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73  E_ENABLE_STAT3.s
17710 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46  tatic int valueF
17720 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65  romExpr(.  Parse
17730 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
17740 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20  r *pExpr, .  u8 
17750 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  aff, .  sqlite3_
17760 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20  value **pp.){.  
17770 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
17780 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c  K_VARIABLE.   ||
17790 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
177a0 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
177b0 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41  r->op2==TK_VARIA
177c0 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  BLE).  ){.    in
177d0 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d 3e  t iVar = pExpr->
177e0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
177f0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
17800 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
17810 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50 3a  , iVar); /* IMP:
17820 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20 2a   R-23257-02778 *
17830 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  /.    *pp = sqli
17840 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
17850 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
17860 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a  re, iVar, aff);.
17870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17880 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
17890 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  rn sqlite3ValueF
178a0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
178b0 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
178c0 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29  E_UTF8, aff, pp)
178d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
178e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
178f0 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d  is used to estim
17900 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
17910 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
17920 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62   be visited.** b
17930 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e  y scanning an in
17940 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
17950 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72  of values. The r
17960 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e  ange may have an
17970 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c   upper.** bound,
17980 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20   a lower bound, 
17990 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45  or both. The WHE
179a0 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
179b0 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70  that set the upp
179c0 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20  er.** and lower 
179d0 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65  bounds are repre
179e0 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72  sented by pLower
179f0 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70   and pUpper resp
17a00 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a  ectively. For.**
17a10 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
17a20 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20  ng that index p 
17a30 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a  is on t1(a):.**.
17a40 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
17a50 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
17a60 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20   a < ? ....**   
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f   |_____|   |____
17a90 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _|.**           
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17ab0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17ad0 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a  Lower    pUpper.
17ae0 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
17af0 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20  of the upper or 
17b00 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e  lower bound is n
17b10 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
17b20 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20   NULL is passed 
17b30 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74  in.** place of t
17b40 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
17b50 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
17b60 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65  * The nEq parame
17b70 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
17b80 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69  e index of the i
17b90 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  ndex column subj
17ba0 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61  ect to the.** ra
17bb0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
17bc0 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
17bd0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
17be0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17bf0 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  ints.** optimize
17c00 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
17c10 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
17c20 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
17c30 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a  ing index p is.*
17c40 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  * on t1(a, b), a
17c50 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
17c60 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
17c70 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
17c80 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
17c90 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
17ca0 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75  ** then nEq shou
17cb0 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 65  ld be passed the
17cc0 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68 65   value 1 (as the
17cd0 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65   range restricte
17ce0 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20  d column,.** b, 
17cf0 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65  is the second le
17d00 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
17d10 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
17d20 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
17d30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
17d40 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
17d50 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
17d60 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
17d70 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
17d80 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65   0..**.** The re
17d90 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
17da0 61 6e 20 69 6e 74 65 67 65 72 20 64 69 76 69 73  an integer divis
17db0 6f 72 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  or to reduce the
17dc0 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20 73 65   estimated.** se
17dd0 61 72 63 68 20 73 70 61 63 65 2e 20 20 41 20 72  arch space.  A r
17de0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
17df0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 61 6e 67   means that rang
17e00 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
17e10 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70 20 61 74 20  e.** no help at 
17e20 61 6c 6c 2e 20 20 41 20 72 65 74 75 72 6e 20 76  all.  A return v
17e30 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
17e40 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
17e50 73 20 61 72 65 0a 2a 2a 20 65 78 70 65 63 74 65  s are.** expecte
17e60 64 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  d to reduce the 
17e70 73 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20  search space by 
17e80 68 61 6c 66 2e 20 20 41 6e 64 20 73 6f 20 66 6f  half.  And so fo
17e90 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rth....**.** In 
17ea0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
17eb0 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e 41 4c  qlite_stat3 ANAL
17ec0 59 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72  YZE data, each r
17ed0 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a  ange inequality.
17ee0 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73  ** reduces the s
17ef0 65 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61  earch space by a
17f00 20 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 20 48   factor of 4.  H
17f10 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  ence a single co
17f20 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a  nstraint (x>?).*
17f30 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  * results in a r
17f40 65 74 75 72 6e 20 6f 66 20 34 20 61 6e 64 20 61  eturn of 4 and a
17f50 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17f60 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
17f70 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
17f80 72 65 74 75 72 6e 20 6f 66 20 31 36 2e 0a 2a 2f  return of 16..*/
17f90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
17fa0 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
17fb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17fc0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
17fd0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
17fe0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
17ff0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18000 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
18010 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
18020 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
18030 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
18040 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
18050 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
18060 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
18070 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
18080 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
18090 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
180a0 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
180b0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
180c0 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
180d0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
180e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
180f0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
18100 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
18110 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
18120 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
18130 20 20 64 6f 75 62 6c 65 20 2a 70 52 61 6e 67 65    double *pRange
18140 44 69 76 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65  Div   /* OUT: Re
18150 64 75 63 65 20 73 65 61 72 63 68 20 73 70 61 63  duce search spac
18160 65 20 62 79 20 74 68 69 73 20 64 69 76 69 73 6f  e by this diviso
18170 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
18180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
18190 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
181a0 42 4c 45 5f 53 54 41 54 33 0a 0a 20 20 69 66 28  BLE_STAT3..  if(
181b0 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 6e 53   nEq==0 && p->nS
181c0 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  ample ){.    sql
181d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e  ite3_value *pRan
181e0 67 65 56 61 6c 3b 0a 20 20 20 20 74 52 6f 77 63  geVal;.    tRowc
181f0 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20  nt iLower = 0;. 
18200 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
18210 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b  r = p->aiRowEst[
18220 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  0];.    tRowcnt 
18230 61 5b 32 5d 3b 0a 20 20 20 20 75 38 20 61 66 66  a[2];.    u8 aff
18240 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
18250 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  ol[p->aiColumn[0
18260 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20  ]].affinity;..  
18270 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
18280 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18290 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70  r = pLower->pExp
182a0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
182b0 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
182c0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
182d0 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56  r, aff, &pRangeV
182e0 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
182f0 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  t( pLower->eOper
18300 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70  ator==WO_GT || p
18310 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
18320 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==WO_GE );.     
18330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18340 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65  OK.       && whe
18350 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
18360 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c  e, p, pRangeVal,
18370 20 30 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f   0, a)==SQLITE_O
18380 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  K.      ){.     
18390 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
183a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
183b0 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  ower->eOperator=
183c0 3d 57 4f 5f 47 54 20 29 20 69 4c 6f 77 65 72 20  =WO_GT ) iLower 
183d0 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  += a[1];.      }
183e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
183f0 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56 61  lueFree(pRangeVa
18400 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
18410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18420 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  && pUpper ){.   
18430 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
18440 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e   pUpper->pExpr->
18450 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63  pRight;.      rc
18460 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
18470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18480 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c 29  aff, &pRangeVal)
18490 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
184a0 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
184b0 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70  r==WO_LT || pUpp
184c0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
184d0 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 69 66  O_LE );.      if
184e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
184f0 20 20 20 20 20 20 20 26 26 20 77 68 65 72 65 4b         && whereK
18500 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
18510 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c 20 31 2c  p, pRangeVal, 1,
18520 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   a)==SQLITE_OK. 
18530 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18540 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 3b 0a 20  iUpper = a[0];. 
18550 20 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65         if( pUppe
18560 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
18570 5f 4c 45 20 29 20 69 55 70 70 65 72 20 2b 3d 20  _LE ) iUpper += 
18580 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a[1];.      }.  
18590 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
185a0 46 72 65 65 28 70 52 61 6e 67 65 56 61 6c 29 3b  Free(pRangeVal);
185b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
185c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
185d0 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
185e0 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  <=iLower ){.    
185f0 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d      *pRangeDiv =
18600 20 28 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f   (double)p->aiRo
18610 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d  wEst[0];.      }
18620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
18630 52 61 6e 67 65 44 69 76 20 3d 20 28 64 6f 75 62  RangeDiv = (doub
18640 6c 65 29 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30  le)p->aiRowEst[0
18650 5d 2f 28 64 6f 75 62 6c 65 29 28 69 55 70 70 65  ]/(double)(iUppe
18660 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
18670 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
18680 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73 63  TRACE(("range sc
18690 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e  an regions: %u..
186a0 25 75 20 20 64 69 76 3d 25 67 5c 6e 22 2c 0a 20  %u  div=%g\n",. 
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75   (u32)iLower, (u
186d0 33 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e  32)iUpper, *pRan
186e0 67 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72  geDiv));.      r
186f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18700 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
18710 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18720 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
18730 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18740 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
18750 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
18760 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
18770 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
18780 3b 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d  ;.  *pRangeDiv =
18790 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 69 66   (double)1;.  if
187a0 28 20 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f  ( pLower && (pLo
187b0 77 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  wer->wtFlags & T
187c0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20  ERM_VNULL)==0 ) 
187d0 2a 70 52 61 6e 67 65 44 69 76 20 2a 3d 20 28 64  *pRangeDiv *= (d
187e0 6f 75 62 6c 65 29 34 3b 0a 20 20 69 66 28 20 70  ouble)4;.  if( p
187f0 55 70 70 65 72 20 29 20 2a 70 52 61 6e 67 65 44  Upper ) *pRangeD
18800 69 76 20 2a 3d 20 28 64 6f 75 62 6c 65 29 34 3b  iv *= (double)4;
18810 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18820 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18830 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
18840 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
18850 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
18860 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
18870 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
18880 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
18890 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
188a0 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
188b0 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
188c0 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
188d0 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
188e0 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
188f0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18900 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
18910 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
18920 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64  tat3 histogram d
18930 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
18940 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
18950 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ex..**.** Write 
18960 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
18970 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
18980 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
18990 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
189a0 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
189b0 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
189c0 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
189d0 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
189e0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
189f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18a00 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
18a10 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18a20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
18a30 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
18a40 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
18a50 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
18a60 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
18a70 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
18a80 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
18a90 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
18aa0 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
18ab0 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
18ac0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
18ad0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
18ae0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
18af0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
18b00 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
18b10 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e  rsing & code gen
18b20 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18b30 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20  */.  Index *p,  
18b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18b50 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66   index whose lef
18b60 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
18b70 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72   pTerm */.  Expr
18b80 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18b90 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
18ba0 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20  or VALUE in the 
18bb0 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69  x=VALUE constrai
18bc0 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a  nt */.  double *
18bd0 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20  pnRow        /* 
18be0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
18bf0 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
18c00 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
18c10 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20  te3_value *pRhs 
18c20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f  = 0;  /* VALUE o
18c30 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
18c40 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20  e of pTerm */.  
18c50 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  u8 aff;         
18c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18c70 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a  umn affinity */.
18c80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18ca0 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ubfunction retur
18cb0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77  n code */.  tRow
18cc0 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20  cnt a[2];       
18cd0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74        /* Statist
18ce0 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
18cf0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18d00 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  );.  aff = p->pT
18d10 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
18d20 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
18d30 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ity;.  if( pExpr
18d40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c   ){.    rc = val
18d50 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
18d60 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
18d70 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72  pRhs);.    if( r
18d80 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
18d90 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
18da0 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
18db0 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61  pRhs = sqlite3Va
18dc0 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64  lueNew(pParse->d
18dd0 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52  b);.  }.  if( pR
18de0 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
18df0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
18e00 20 20 72 63 20 3d 20 77 68 65 72 65 4b 65 79 53    rc = whereKeyS
18e10 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
18e20 70 52 68 73 2c 20 30 2c 20 61 29 3b 0a 20 20 69  pRhs, 0, a);.  i
18e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18e40 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
18e50 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
18e60 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e  an regions: %d\n
18e70 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a  ", (int)a[1]));.
18e80 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31      *pnRow = a[1
18e90 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71 75 61  ];.  }.whereEqua
18ea0 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18eb0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18ec0 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18ed0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18ee0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18ef0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29  TE_ENABLE_STAT3)
18f00 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
18f10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18f20 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18f30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18f40 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18f50 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18f60 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
18f70 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
18f80 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
18f90 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
18fa0 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
18fb0 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
18fc0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
18fd0 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
18fe0 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
18ff0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
19000 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
19010 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
19020 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
19030 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
19040 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
19050 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
19060 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19070 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19080 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19090 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
190a0 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
190b0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
190c0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
190d0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
190e0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
190f0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
19100 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
19110 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
19120 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
19130 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
19140 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
19150 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
19160 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
19170 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
19180 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
19190 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
191a0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
191b0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
191c0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
191d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
191e0 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
191f0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
19200 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c  pTerm */.  ExprL
19210 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
19220 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
19230 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
19240 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
19250 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c  ...)" */.  doubl
19260 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
19270 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
19280 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
19290 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
192a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
192b0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
192c0 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
192d0 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c   code */.  doubl
192e0 65 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  e nEst;         
192f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19300 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
19310 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
19320 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d  double nRowEst =
19330 20 28 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e   (double)0; /* N
19340 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
19350 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
19360 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
19390 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
193a0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
193b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
193c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
193d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
193e0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
193f0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
19400 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
19410 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
19420 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  , p, pList->a[i]
19430 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
19440 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
19450 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  Est;.  }.  if( r
19460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19470 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
19480 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  > p->aiRowEst[0]
19490 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e   ) nRowEst = p->
194a0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
194b0 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
194c0 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
194d0 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  E(("IN row estim
194e0 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
194f0 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
19500 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
19510 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19520 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19530 41 54 33 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  AT3) */.../*.** 
19540 46 69 6e 64 20 74 68 65 20 62 65 73 74 20 71 75  Find the best qu
19550 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
19560 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
19570 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74  lar table.  Writ
19580 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
19590 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
195a0 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
195b0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
195c0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
195d0 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  ** last paramete
195e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  r..**.** The low
195f0 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69  est cost plan wi
19600 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
19610 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
19620 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
19630 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
19640 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f 63  O needed to proc
19650 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 65  ess the requeste
19660 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63  d result..** Fac
19670 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
19680 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
19690 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
196a0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
196b0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
196c0 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
196d0 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
196e0 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
196f0 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
19700 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
19710 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
19720 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
19730 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
19740 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
19750 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
19760 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
19770 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
19780 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ain table..**.**
19790 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
197a0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
197b0 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78  se (pSrc->pIndex
197c0 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  ) attached to th
197d0 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  e table in.** th
197e0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  e SQL statement,
197f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
19800 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  ion only conside
19810 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74  rs plans using t
19820 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64  he .** named ind
19830 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70  ex. If no such p
19840 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  lan is found, th
19850 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
19860 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54  cost is.** SQLIT
19870 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20  E_BIG_DBL. If a 
19880 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68  plan is found th
19890 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65  at uses the name
198a0 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65  d index, .** the
198b0 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63 61  n the cost is ca
198c0 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20  lculated in the 
198d0 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  usual way..**.**
198e0 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45   If a NOT INDEXE
198f0 44 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e  D clause (pSrc->
19900 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77  notIndexed!=0) w
19910 61 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  as attached to t
19920 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20  he table .** in 
19930 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19940 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e  ment, then no in
19950 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64  dexes are consid
19960 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74  ered. However, t
19970 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20  he .** selected 
19980 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74  plan may still t
19990 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
199a0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 72 6f   the built-in ro
199b0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  wid primary key.
199c0 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ** index..*/.sta
199d0 74 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72  tic void bestBtr
199e0 65 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  eeIndex(.  Parse
199f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19a10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
19a20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19a30 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
19a40 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19a50 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19a60 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
19a70 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
19a80 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
19a90 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
19aa0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
19ab0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
19ac0 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  f cursors not av
19ad0 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65  ailable for inde
19ae0 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
19af0 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20  k notValid,     
19b00 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
19b10 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
19b20 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a  or any purpose *
19b30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
19b40 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
19b50 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
19b60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
19b70 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
19b80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
19b90 65 6c 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75  elect-list if qu
19ba0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
19bb0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
19bc0 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
19bd0 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
19be0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
19bf0 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
19c00 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
19c10 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
19c20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
19c30 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
19c40 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
19c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
19c60 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
19c70 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
19c80 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
19c90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
19ca0 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a   of pProbe, or z
19cb0 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65  ero for IPK inde
19cc0 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  x */.  int eqTer
19cd0 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
19ce0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61     /* Current ma
19cf0 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
19d00 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
19d10 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72  /.  int idxEqTer
19d20 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
19d30 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66  /* Index mask of
19d40 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
19d50 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49  operators */.  I
19d60 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
19d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19d80 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
19d90 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
19da0 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
19db0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
19dc0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
19dd0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
19de0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
19df0 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
19e00 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
19e10 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
19e20 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
19e30 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
19e40 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20  int wsFlagMask; 
19e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19e60 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20  llowed flags in 
19e70 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
19e80 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  ag */..  /* Init
19e90 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20  ialize the cost 
19ea0 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20  to a worst-case 
19eb0 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  value */.  memse
19ec0 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
19ed0 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
19ee0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
19ef0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
19f00 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
19f10 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
19f20 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
19f30 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
19f40 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
19f50 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
19f60 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
19f70 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
19f80 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
19f90 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
19fa0 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
19fb0 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
19fc0 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
19fd0 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
19fe0 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
19ff0 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
1a000 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
1a010 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
1a020 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
1a030 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
1a040 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
1a050 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
1a060 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
1a070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1a080 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
1a090 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1a0a0 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
1a0b0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
1a0c0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
1a0d0 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
1a0e0 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
1a0f0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
1a100 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72  /.    pIdx = pPr
1a110 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
1a120 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  ex;.    wsFlagMa
1a130 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
1a140 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1a150 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
1a160 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
1a170 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73  TermMask;.  }els
1a180 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1a190 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
1a1a0 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
1a1b0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
1a1c0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
1a1d0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
1a1e0 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
1a1f0 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
1a200 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
1a210 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
1a220 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
1a230 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
1a240 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
1a250 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
1a260 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
1a270 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
1a280 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
1a290 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a2a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
1a2b0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
1a2c0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
1a2d0 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
1a2e0 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
1a2f0 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
1a300 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
1a310 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
1a320 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
1a330 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
1a340 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
1a350 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
1a360 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
1a370 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
1a380 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
1a390 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
1a3a0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
1a3b0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
1a3c0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
1a3d0 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
1a3e0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1a3f0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
1a400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
1a410 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
1a420 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
1a430 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
1a440 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
1a450 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
1a460 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
1a470 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a480 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
1a490 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
1a4a0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
1a4b0 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
1a4c0 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
1a4d0 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
1a4e0 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1a4f0 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
1a500 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
1a510 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
1a520 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
1a530 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
1a540 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
1a550 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
1a560 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
1a570 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
1a580 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
1a590 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
1a5a0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
1a5b0 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
1a5c0 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20 2a 20  const tRowcnt * 
1a5d0 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d  const aiRowEst =
1a5e0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
1a5f0 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  t;.    double co
1a600 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1a610 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
1a620 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
1a630 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a650 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
1a660 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
1a670 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64  ult set */.    d
1a680 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 3b 20 20 20  ouble log10N;   
1a690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 61             /* ba
1a6a0 73 65 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20  se-10 logarithm 
1a6b0 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74  of nRow (inexact
1a6c0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76  ) */.    int rev
1a6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a6e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1a6f0 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1a700 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
1a710 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
1a720 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
1a730 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   0;..    /* The 
1a740 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1a750 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
1a760 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70  d based on the p
1a770 72 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20  roperties of.   
1a780 20 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20   ** index being 
1a790 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20  evaluated. They 
1a7a0 61 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f  are then used to
1a7b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
1a7c0 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63  xpected.    ** c
1a7d0 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ost and number o
1a7e0 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e  f rows returned.
1a7f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a800 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
1a810 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1a820 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
1a830 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
1a840 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1a850 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
1a860 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1a870 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
1a880 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
1a890 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
1a8a0 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
1a8b0 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
1a8c0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1a8d0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
1a8e0 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
1a8f0 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
1a900 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
1a910 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
1a920 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
1a930 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
1a940 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
1a950 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1a960 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
1a970 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
1a980 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
1a990 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1a9a0 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
1a9b0 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
1a9c0 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1a9d0 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
1a9e0 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
1a9f0 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
1aa00 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
1aa10 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
1aa20 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
1aa30 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
1aa40 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
1aa50 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
1aa60 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
1aa70 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
1aa80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
1aa90 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
1aaa0 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
1aab0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1aac0 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
1aad0 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
1aae0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1aaf0 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
1ab00 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
1ab10 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
1ab20 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
1ab30 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
1ab40 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1ab50 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
1ab60 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
1ab70 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
1ab80 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
1ab90 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
1aba0 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
1abb0 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
1abc0 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
1abd0 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
1abe0 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
1abf0 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
1ac00 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
1ac10 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
1ac20 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
1ac30 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
1ac40 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
1ac50 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
1ac60 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
1ac70 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
1ac80 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
1ac90 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
1aca0 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
1acb0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
1acc0 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
1acd0 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
1ace0 2a 2a 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20  **  rangeDiv:.  
1acf0 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
1ad00 61 74 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72  ate of a divisor
1ad10 20 62 79 20 77 68 69 63 68 20 74 6f 20 72 65 64   by which to red
1ad20 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
1ad30 70 61 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20  pace due.    ** 
1ad40 20 20 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79     to inequality
1ad50 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49   constraints.  I
1ad60 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
1ad70 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
1ad80 41 4c 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20  ALYZE.    **    
1ad90 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69  data, a single i
1ada0 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
1adb0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
1adc0 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a  ce to 1/4rd its.
1add0 20 20 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e      **    origin
1ade0 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1adf0 76 3d 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71  v==4).  Two ineq
1ae00 75 61 6c 69 74 69 65 73 20 72 65 64 75 63 65 20  ualities reduce 
1ae10 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
1ae20 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
1ae30 31 36 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67  16th of its orig
1ae40 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65  inal size (range
1ae50 44 69 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a  Div==16)..    **
1ae60 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
1ae70 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
1ae80 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1ae90 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1aea0 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
1aeb0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1aec0 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1aed0 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
1aee0 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
1aef0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1af00 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
1af10 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
1af20 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
1af30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c     **.    **  bL
1af40 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20  ookup: .    **  
1af50 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
1af60 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  if a table looku
1af70 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  p is required fo
1af80 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74  r each index ent
1af90 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73  ry.    **    vis
1afa0 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20  ited.  In other 
1afb0 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20 74  words, true if t
1afc0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76  his is not a cov
1afd0 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
1afe0 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20 61   **    This is a
1aff0 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20  lways false for 
1b000 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72  the rowid primar
1b010 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61  y key index of a
1b020 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20   table..    **  
1b030 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65    For other inde
1b040 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65 20  xes, it is true 
1b050 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63  unless all the c
1b060 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1b070 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73  ble.    **    us
1b080 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
1b090 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70   statement are p
1b0a0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
1b0b0 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20  dex (such an.   
1b0c0 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20   **    index is 
1b0d0 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
1b0e0 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
1b0f0 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
1b100 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
1b110 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
1b120 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
1b130 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
1b140 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
1b150 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
1b160 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
1b170 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  tree lookups in 
1b180 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68  order to find th
1b190 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20  e value.    **  
1b1a0 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62    of column c, b
1b1b0 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65  ut the first doe
1b1c0 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f  s not because co
1b1d0 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72  lumns a and b ar
1b1e0 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68  e.    **    both
1b1f0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1b200 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  e index..    **.
1b210 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1b220 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20     SELECT a, b  
1b230 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45    FROM tbl WHERE
1b240 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20   a = 1;.    **  
1b250 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1b260 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
1b270 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1b280 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1b290 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1b2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b2b0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1b2c0 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 69 6e  erms matching in
1b2d0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  dex */.    int b
1b2e0 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20  InEst = 0;      
1b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b300 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43   if "x IN (SELEC
1b310 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20  T...)" seen */. 
1b320 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20     int nInMul = 
1b330 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1b340 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
1b350 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65  stinct equalitie
1b360 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  s to lookup */. 
1b370 20 20 20 64 6f 75 62 6c 65 20 72 61 6e 67 65 44     double rangeD
1b380 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20  iv = (double)1; 
1b390 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65   /* Estimated re
1b3a0 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63  duction in searc
1b3b0 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  h space */.    i
1b3c0 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20  nt nBound = 0;  
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3e0 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20  Number of range 
1b3f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e  constraints seen
1b400 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f 72   */.    int bSor
1b410 74 20 3d 20 21 21 70 4f 72 64 65 72 42 79 3b 20  t = !!pOrderBy; 
1b420 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b430 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72   external sort r
1b440 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
1b450 6e 74 20 62 44 69 73 74 20 3d 20 21 21 70 44 69  nt bDist = !!pDi
1b460 73 74 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  stinct;      /* 
1b470 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63 61  True if index ca
1b480 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44  nnot help with D
1b490 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69  ISTINCT */.    i
1b4a0 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20  nt bLookup = 0; 
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4c0 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f  True if not a co
1b4d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1b4e0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1b4f0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1b500 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
1b510 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1b520 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66  clause */.#ifdef
1b530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1b540 54 41 54 33 0a 20 20 20 20 57 68 65 72 65 54 65  TAT3.    WhereTe
1b550 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d  rm *pFirstTerm =
1b560 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20   0;    /* First 
1b570 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68  term matching th
1b580 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69  e index */.#endi
1b590 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  f..    /* Determ
1b5a0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1b5b0 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nEq and nInMul
1b5c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d   */.    for(nEq=
1b5d0 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  0; nEq<pProbe->n
1b5e0 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a  Column; nEq++){.
1b5f0 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1b600 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
1b610 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
1b620 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1b630 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1b640 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
1b650 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  pIdx);.      if(
1b660 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
1b670 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  k;.      wsFlags
1b680 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d   |= (WHERE_COLUM
1b690 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  N_EQ|WHERE_ROWID
1b6a0 5f 45 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _EQ);.      if( 
1b6b0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b6c0 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1b6d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1b6e0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1b6f0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
1b700 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
1b710 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  IN;.        if( 
1b720 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1b730 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1b740 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
1b750 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
1b760 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d  CT ...)":  Assum
1b770 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  e the SELECT ret
1b780 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
1b790 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c            nInMul
1b7a0 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
1b7b0 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20    bInEst = 1;.  
1b7c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b7d0 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
1b7e0 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
1b7f0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
1b800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b810 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
1b820 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
1b830 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1b840 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1b850 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1b860 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1b870 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1b880 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
1b890 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
1b8a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1b8b0 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  MN_NULL;.      }
1b8c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b8d0 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
1b8e0 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1b8f0 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20  pProbe->aSample 
1b900 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70  ) pFirstTerm = p
1b910 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Term;.#endif.   
1b920 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d     used |= pTerm
1b930 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1b940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74     }..    /* Det
1b950 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1b960 20 6f 66 20 72 61 6e 67 65 44 69 76 20 2a 2f 0a   of rangeDiv */.
1b970 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f      if( nEq<pPro
1b980 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70  be->nColumn && p
1b990 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65  Probe->bUnordere
1b9a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  d==0 ){.      in
1b9b0 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
1b9c0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
1b9d0 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
1b9e0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
1b9f0 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
1ba00 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
1ba10 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20   pIdx) ){.      
1ba20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
1ba30 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  p = findTerm(pWC
1ba40 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1ba50 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
1ba60 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1ba70 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74 6d   WhereTerm *pBtm
1ba80 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1ba90 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1baa0 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1bab0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1bac0 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
1bad0 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1bae0 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f  , nEq, pBtm, pTo
1baf0 70 2c 20 26 72 61 6e 67 65 44 69 76 29 3b 0a 20  p, &rangeDiv);. 
1bb00 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20         if( pTop 
1bb10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f  ){.          nBo
1bb20 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
1bb30 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1bb40 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
1bb50 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
1bb60 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67   pTop->prereqRig
1bb70 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
1bb80 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
1bb90 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
1bba0 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nd++;.          
1bbb0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1bbc0 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
1bbd0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42        used |= pB
1bbe0 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
1bbf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bc00 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57     wsFlags |= (W
1bc10 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1bc20 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  E|WHERE_ROWID_RA
1bc30 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NGE);.      }.  
1bc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
1bc50 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1bc60 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1bc70 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
1bc80 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
1bc90 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1bca0 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  L );.      if( (
1bcb0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1bcc0 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1bcd0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d  _COLUMN_NULL))==
1bce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1bcf0 6c 61 67 73 20 7c 3d 20 28 70 50 72 6f 62 65 2d  lags |= (pProbe-
1bd00 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1bd10 65 29 20 3f 20 57 48 45 52 45 5f 55 4e 49 51 55  e) ? WHERE_UNIQU
1bd20 45 20 3a 20 57 48 45 52 45 5f 55 4e 51 5f 57 41  E : WHERE_UNQ_WA
1bd30 4e 54 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NTED;.      }.  
1bd40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1bd50 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1bd60 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
1bd70 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
1bd80 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20  onsidered will. 
1bd90 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20     ** naturally 
1bda0 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65  scan rows in the
1bdb0 20 72 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c   required order,
1bdc0 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1bdd0 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a  iate flags.    *
1bde0 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74  * in wsFlags. Ot
1bdf0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1be00 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1be10 20 63 6c 61 75 73 65 20 62 75 74 20 74 68 65 20   clause but the 
1be20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c  index.    ** wil
1be30 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61  l scan rows in a
1be40 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1be50 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 20  , set the bSort 
1be60 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
1be70 20 20 69 66 28 20 69 73 53 6f 72 74 69 6e 67 49    if( isSortingI
1be80 6e 64 65 78 28 0a 20 20 20 20 20 20 20 20 20 20  ndex(.          
1be90 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 70 4d 61  pParse, pWC->pMa
1bea0 73 6b 53 65 74 2c 20 70 50 72 6f 62 65 2c 20 69  skSet, pProbe, i
1beb0 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 6e  Cur, pOrderBy, n
1bec0 45 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72 65  Eq, wsFlags, &re
1bed0 76 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  v).    ){.      
1bee0 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  bSort = 0;.     
1bef0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1bf00 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1bf10 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1bf20 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a  |WHERE_ORDERBY;.
1bf30 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1bf40 20 28 72 65 76 20 3f 20 57 48 45 52 45 5f 52 45   (rev ? WHERE_RE
1bf50 56 45 52 53 45 20 3a 20 30 29 3b 0a 20 20 20 20  VERSE : 0);.    
1bf60 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1bf70 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54  re is a DISTINCT
1bf80 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20 74   qualifier and t
1bf90 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 73  his index will s
1bfa0 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20 20  can rows in.    
1bfb0 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ** order of the 
1bfc0 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
1bfd0 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69 73  ions, clear bDis
1bfe0 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 61 70  t and set the ap
1bff0 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a 2a  propriate.    **
1c000 20 66 6c 61 67 73 20 69 6e 20 77 73 46 6c 61 67   flags in wsFlag
1c010 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  s. */.    if( is
1c020 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70 50  DistinctIndex(pP
1c030 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f 62  arse, pWC, pProb
1c040 65 2c 20 69 43 75 72 2c 20 70 44 69 73 74 69 6e  e, iCur, pDistin
1c050 63 74 2c 20 6e 45 71 29 20 29 7b 0a 20 20 20 20  ct, nEq) ){.    
1c060 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20    bDist = 0;.   
1c070 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1c080 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c  ERE_ROWID_RANGE|
1c090 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1c0a0 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  GE|WHERE_DISTINC
1c0b0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  T;.    }..    /*
1c0c0 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61   If currently ca
1c0d0 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f  lculating the co
1c0e0 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  st of using an i
1c0f0 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50  ndex (not the IP
1c100 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c  K.    ** index),
1c110 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c   determine if al
1c120 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  l required colum
1c130 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62  n data may be ob
1c140 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a  tained without .
1c150 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65      ** using the
1c160 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65   main table (i.e
1c170 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  . if the index i
1c180 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20  s a covering.   
1c190 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68   ** index for th
1c1a0 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69 74  is query). If it
1c1b0 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48 45   is, set the WHE
1c1c0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67  RE_IDX_ONLY flag
1c1d0 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61   in.    ** wsFla
1c1e0 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  gs. Otherwise, s
1c1f0 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76  et the bLookup v
1c200 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e  ariable to true.
1c210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64    */.    if( pId
1c220 78 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b 0a  x && wsFlags ){.
1c230 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
1c240 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b  = pSrc->colUsed;
1c250 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1c260 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1c270 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
1c280 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
1c290 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
1c2a0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
1c2b0 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
1c2c0 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
1c2d0 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
1c2e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c2f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
1c300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1c310 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
1c320 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  X_ONLY;.      }e
1c330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f  lse{.        bLo
1c340 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  okup = 1;.      
1c350 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
1c360 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20      ** Estimate 
1c370 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1c380 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46  ws of output.  F
1c390 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45 4c  or an "x IN (SEL
1c3a0 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ECT...)".    ** 
1c3b0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20 6e  constraint, do n
1c3c0 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1c3d0 61 74 65 20 65 78 63 65 65 64 20 68 61 6c 66 20  ate exceed half 
1c3e0 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
1c3f0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
1c400 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65    nRow = (double
1c410 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20  )(aiRowEst[nEq] 
1c420 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69  * nInMul);.    i
1c430 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52 6f  f( bInEst && nRo
1c440 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  w*2>aiRowEst[0] 
1c450 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  ){.      nRow = 
1c460 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20  aiRowEst[0]/2;. 
1c470 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69       nInMul = (i
1c480 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f 77  nt)(nRow / aiRow
1c490 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d  Est[nEq]);.    }
1c4a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c4b0 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20  ENABLE_STAT3.   
1c4c0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74   /* If the const
1c4d0 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20  raint is of the 
1c4e0 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f 72 20  form x=VALUE or 
1c4f0 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e 2e 29  x IN (E1,E2,...)
1c500 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20 64  .    ** and we d
1c510 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68 61 74  o not think that
1c520 20 76 61 6c 75 65 73 20 6f 66 20 78 20 61 72 65   values of x are
1c530 20 75 6e 69 71 75 65 20 61 6e 64 20 69 66 20 68   unique and if h
1c540 69 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20  istogram.    ** 
1c550 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
1c560 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c 20  e for column x, 
1c570 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62 65  then it might be
1c580 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1c590 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
1c5a0 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65   estimate on the
1c5b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1c5c0 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20  based on.    ** 
1c5d0 56 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63 6f  VALUE and how co
1c5e0 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65 20  mmon that value 
1c5f0 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  is according to 
1c600 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a 20  the histogram.. 
1c610 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c620 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20  ow>(double)1 && 
1c630 6e 45 71 3d 3d 31 20 26 26 20 70 46 69 72 73 74  nEq==1 && pFirst
1c640 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f 77  Term!=0 && aiRow
1c650 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20 20  Est[1]>1 ){.    
1c660 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d    if( pFirstTerm
1c670 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1c680 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_EQ|WO_ISNULL) 
1c690 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1c6a0 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1c6b0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
1c6c0 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Q );.        tes
1c6d0 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
1c6e0 6d 2d 3e 70 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->pOperator==WO
1c6f0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1c700 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61     whereEqualSca
1c710 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1c720 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1c730 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1c740 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65  &nRow);.      }e
1c750 6c 73 65 20 69 66 28 20 70 46 69 72 73 74 54 65  lse if( pFirstTe
1c760 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1c770 4f 5f 49 4e 20 26 26 20 62 49 6e 45 73 74 3d 3d  O_IN && bInEst==
1c780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65  0 ){.        whe
1c790 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
1c7a0 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1c7b0 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78  stTerm->pExpr->x
1c7c0 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a  .pList, &nRow);.
1c7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1c7e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1c7f0 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a  NABLE_STAT3 */..
1c800 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68      /* Adjust th
1c810 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
1c820 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e  ut rows and down
1c830 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20  ward to reflect 
1c840 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  rows.    ** that
1c850 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79   are excluded by
1c860 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1c870 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ts..    */.    n
1c880 52 6f 77 20 3d 20 6e 52 6f 77 2f 72 61 6e 67 65  Row = nRow/range
1c890 44 69 76 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  Div;.    if( nRo
1c8a0 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a  w<1 ) nRow = 1;.
1c8b0 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65  .    /* Experime
1c8c0 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20  nts run on real 
1c8d0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 73  SQLite databases
1c8e0 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 74   show that the t
1c8f0 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a  ime needed.    *
1c900 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79  * to do a binary
1c910 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74   search to locat
1c920 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62  e a row in a tab
1c930 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72  le or index is r
1c940 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f  oughly.    ** lo
1c950 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65  g10(N) times the
1c960 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72   time to move fr
1c970 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68  om one row to th
1c980 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69  e next row withi
1c990 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  n.    ** a table
1c9a0 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20   or index.  The 
1c9b0 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e  actual times can
1c9c0 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65 20   vary, with the 
1c9d0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72  size of.    ** r
1c9e0 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20  ecords being an 
1c9f0 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72  important factor
1ca00 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e  .  Both moves an
1ca10 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a 20  d searches are. 
1ca20 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74     ** slower wit
1ca30 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73  h larger records
1ca40 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63  , presumably bec
1ca50 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f 72  ause fewer recor
1ca60 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e  ds fit.    ** on
1ca70 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65   one page and he
1ca80 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68  nce more pages h
1ca90 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68 65  ave to be fetche
1caa0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1cab0 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   The ANALYZE com
1cac0 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c  mand and the sql
1cad0 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
1cae0 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65  lite_stat2 table
1caf0 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  s do.    ** not 
1cb00 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20  give us data on 
1cb10 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
1cb20 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20  es of table and 
1cb30 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20  index records.. 
1cb40 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f     ** So this co
1cb50 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mputation assume
1cb60 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20  s table records 
1cb70 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65 20  are about twice 
1cb80 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73  as big.    ** as
1cb90 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20   index records. 
1cba0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1cbb0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
1cbc0 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
1cbd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1cbe0 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74  cost of a full t
1cbf0 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20 6e  able scan is a n
1cc00 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70  umber of move op
1cc10 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20  erations equal. 
1cc20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e       ** to the n
1cc30 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1cc40 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
1cc50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
1cc60 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f 6e   add an addition
1cc70 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74 6f  al 4x penalty to
1cc80 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
1cc90 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73 0a  s.  This causes.
1cca0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73        ** the cos
1ccb0 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72  t function to er
1ccc0 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f 66  r on the side of
1ccd0 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64   choosing an ind
1cce0 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a  ex over.      **
1ccf0 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c   choosing a full
1cd00 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78 20   scan.  This 4x 
1cd10 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74  full-scan penalt
1cd20 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c 65  y is an arguable
1cd30 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73 69  .      ** decisi
1cd40 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63 68  on and one which
1cd50 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72 65   we expect to re
1cd60 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75 74  visit in the fut
1cd70 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20 20  ure.  But.      
1cd80 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20 62  ** it seems to b
1cd90 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65  e working well e
1cda0 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f 6d  nough at the mom
1cdb0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1cdc0 20 20 20 20 63 6f 73 74 20 3d 20 61 69 52 6f 77      cost = aiRow
1cdd0 45 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 7d 65  Est[0]*4;.    }e
1cde0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30  lse{.      log10
1cdf0 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77  N = estLog(aiRow
1ce00 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63  Est[0]);.      c
1ce10 6f 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  ost = nRow;.    
1ce20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1ce30 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75        if( bLooku
1ce40 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  p ){.          /
1ce50 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c  * For an index l
1ce60 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62  ookup followed b
1ce70 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  y a table lookup
1ce80 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1ce90 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
1cea0 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1ceb0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1cec0 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20  h index range.  
1ced0 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1cee0 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1cef0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1cf00 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1cf10 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1cf20 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62  o lookup the tab
1cf30 6c 65 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  le entry using t
1cf40 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20  he rowid.       
1cf50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1cf60 63 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20  cost += (nInMul 
1cf70 2b 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a  + nRow)*log10N;.
1cf80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cf90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1cfa0 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1cfb0 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1cfc0 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20     nInMul index 
1cfd0 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1cfe0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1cff0 72 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ry .          **
1d000 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20     + nRow steps 
1d010 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
1d020 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  x.          */. 
1d030 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d           cost +=
1d040 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a   nInMul*log10N;.
1d050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d070 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72  * For a rowid pr
1d080 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70  imary key lookup
1d090 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  :.        **    
1d0a0 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65  nInMult table se
1d0b0 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74  arches to find t
1d0c0 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79  he initial entry
1d0d0 20 66 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a   for each range.
1d0e0 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1d0f0 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1d100 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
1d110 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
1d120 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67  st += nInMul*log
1d130 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  10N;.      }.   
1d140 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69   }..    /* Add i
1d150 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  n the estimated 
1d160 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
1d170 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74  the result.  Act
1d180 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ual experimental
1d190 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d  .    ** measurem
1d1a0 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20  ents of sorting 
1d1b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53  performance in S
1d1c0 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74 20  QLite show that 
1d1d0 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20  sorting time.   
1d1e0 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67   ** adds C*N*log
1d1f0 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73  10(N) to the cos
1d200 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  t, where N is th
1d210 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1d220 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1d230 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20 61  orted and C is a
1d240 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20   factor between 
1d250 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57  1.95 and 4.3.  W
1d260 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65  e will split the
1d270 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  .    ** differen
1d280 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20  ce and select C 
1d290 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20  of 3.0..    */. 
1d2a0 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a     if( bSort ){.
1d2b0 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52        cost += nR
1d2c0 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 2a  ow*estLog(nRow)*
1d2d0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  3;.    }.    if(
1d2e0 20 62 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20   bDist ){.      
1d2f0 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  cost += nRow*est
1d300 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20  Log(nRow)*3;.   
1d310 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f   }..    /**** Co
1d320 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73  st of using this
1d330 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62   index has now b
1d340 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a  een computed ***
1d350 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  */..    /* If th
1d360 65 72 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e  ere are addition
1d370 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  al constraints o
1d380 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
1d390 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20  t cannot.    ** 
1d3a0 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  be used with the
1d3b0 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20   current index, 
1d3c0 62 75 74 20 77 68 69 63 68 20 6d 69 67 68 74 20  but which might 
1d3d0 6c 6f 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72  lower the number
1d3e0 0a 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75  .    ** of outpu
1d3f0 74 20 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74  t rows, adjust t
1d400 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63  he nRow value ac
1d410 63 6f 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73  cordingly.  This
1d420 20 6f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61   only .    ** ma
1d430 74 74 65 72 73 20 69 66 20 74 68 65 20 63 75 72  tters if the cur
1d440 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68  rent index is th
1d450 65 20 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20  e least costly, 
1d460 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72  so do not bother
1d470 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69  .    ** with thi
1d480 73 20 73 74 65 70 20 69 66 20 77 65 20 61 6c 72  s step if we alr
1d490 65 61 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69  eady know this i
1d4a0 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
1d4b0 20 63 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20   chosen..    ** 
1d4c0 41 6c 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75  Also, never redu
1d4d0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ce the output ro
1d4e0 77 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20  w count below 2 
1d4f0 75 73 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e  using this step.
1d500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d510 74 20 69 73 20 63 72 69 74 69 63 61 6c 20 74 68  t is critical th
1d520 61 74 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20  at the notValid 
1d530 6d 61 73 6b 20 62 65 20 75 73 65 64 20 68 65 72  mask be used her
1d540 65 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  e instead of.   
1d550 20 2a 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79   ** the notReady
1d560 20 6d 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d   mask.  When com
1d570 70 75 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d  puting an "optim
1d580 61 6c 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e  al" index, the n
1d590 6f 74 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d  otReady.    ** m
1d5a0 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ask will only ha
1d5b0 76 65 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d  ve one bit set -
1d5c0 20 74 68 65 20 62 69 74 20 66 6f 72 20 74 68 65   the bit for the
1d5d0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a   current table..
1d5e0 20 20 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61      ** The notVa
1d5f0 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65  lid mask, on the
1d600 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77   other hand, alw
1d610 61 79 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73  ays has all bits
1d620 20 73 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20   set for.    ** 
1d630 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  tables that are 
1d640 6e 6f 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  not in outer loo
1d650 70 73 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79  ps.  If notReady
1d660 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e   is used here in
1d670 73 74 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20  stead.    ** of 
1d680 6e 6f 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61  notValid, then a
1d690 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74   optimal index t
1d6a0 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  hat depends on i
1d6b0 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73  nner joins loops
1d6c0 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
1d6d0 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77   selected even w
1d6e0 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
1d6f0 20 61 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65   an optimal inde
1d700 78 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a  x that has.    *
1d710 2a 20 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64  * no such depend
1d720 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ency..    */.   
1d730 20 69 66 28 20 6e 52 6f 77 3e 32 20 26 26 20 63   if( nRow>2 && c
1d740 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  ost<=pCost->rCos
1d750 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  t ){.      int k
1d760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d770 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d780 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1d790 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e   int nSkipEq = n
1d7a0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Eq;           /*
1d7b0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f   Number of == co
1d7c0 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69  nstraints to ski
1d7d0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  p */.      int n
1d7e0 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75  SkipRange = nBou
1d7f0 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  nd;     /* Numbe
1d800 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e  r of < constrain
1d810 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ts to skip */.  
1d820 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73      Bitmask this
1d830 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1d840 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70   /* Bitmap for p
1d850 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68  Src */..      th
1d860 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28  isTab = getMask(
1d870 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
1d880 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Cur);.      for(
1d890 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d  pTerm=pWC->a, k=
1d8a0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77  pWC->nTerm; nRow
1d8b0 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54  >2 && k; k--, pT
1d8c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1d8d0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1d8e0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1d8f0 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
1d900 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1d910 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
1d920 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62  tValid)!=thisTab
1d930 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d940 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1d950 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1d960 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1d970 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
1d980 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a   if( nSkipEq ){.
1d990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d9a0 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  gnore the first 
1d9b0 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74  nEq equality mat
1d9c0 63 68 65 73 20 73 69 6e 63 65 20 74 68 65 20 69  ches since the i
1d9d0 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
1d9e0 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
1d9f0 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68  accounted for th
1da00 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ese */.         
1da10 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20     nSkipEq--;.  
1da20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1da30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
1da40 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69  sume each additi
1da50 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61  onal equality ma
1da60 74 63 68 20 72 65 64 75 63 65 73 20 74 68 65 20  tch reduces the 
1da70 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20  result.         
1da80 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62     ** set size b
1da90 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30  y a factor of 10
1daa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1dab0 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20  nRow /= 10;.    
1dac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dad0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1dae0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1daf0 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1db00 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
1db10 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e      if( nSkipRan
1db20 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1db30 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1db40 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65  first nSkipRange
1db50 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1db60 74 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  ts since the ind
1db70 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1db80 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1db90 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1dba0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1dbb0 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20   nSkipRange--;. 
1dbc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1dbe0 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74  ssume each addit
1dbf0 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73  ional range cons
1dc00 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
1dc10 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1dc20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a        ** set siz
1dc30 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
1dc40 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e   3.  Indexed ran
1dc50 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ge constraints r
1dc60 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
1dc70 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20    ** the search 
1dc80 73 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65  space by a large
1dc90 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65  r factor: 4.  We
1dca0 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61   make indexed ra
1dcb0 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nge.            
1dcc0 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  ** more selectiv
1dcd0 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20  e intentionally 
1dce0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73  because of the s
1dcf0 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20  ubjective .     
1dd00 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76         ** observ
1dd10 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78  ation that index
1dd20 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1dd30 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20  ints really are 
1dd40 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  more.           
1dd50 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e   ** selective in
1dd60 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76   practice, on av
1dd70 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  erage. */.      
1dd80 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b        nRow /= 3;
1dd90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dda0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ddb0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
1ddc0 3d 57 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  =WO_NOOP ){.    
1ddd0 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
1dde0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  er expression lo
1ddf0 77 65 72 73 20 74 68 65 20 6f 75 74 70 75 74 20  wers the output 
1de00 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c  row count by hal
1de10 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  f */.          n
1de20 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  Row /= 2;.      
1de30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1de40 20 20 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e    if( nRow<2 ) n
1de50 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a  Row = 2;.    }..
1de60 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
1de70 28 0a 20 20 20 20 20 20 22 25 73 28 25 73 29 3a  (.      "%s(%s):
1de80 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25   nEq=%d nInMul=%
1de90 64 20 72 61 6e 67 65 44 69 76 3d 25 64 20 62 53  d rangeDiv=%d bS
1dea0 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25  ort=%d bLookup=%
1deb0 64 20 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e  d wsFlags=0x%x\n
1dec0 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20  ".      "       
1ded0 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c    notReady=0x%ll
1dee0 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52  x log10N=%.1f nR
1def0 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31  ow=%.1f cost=%.1
1df00 66 20 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22  f used=0x%llx\n"
1df10 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54  ,.      pSrc->pT
1df20 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78  ab->zName, (pIdx
1df30 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
1df40 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20   "ipk"), .      
1df50 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e  nEq, nInMul, (in
1df60 74 29 72 61 6e 67 65 44 69 76 2c 20 62 53 6f 72  t)rangeDiv, bSor
1df70 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c  t, bLookup, wsFl
1df80 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f 74 52 65  ags,.      notRe
1df90 61 64 79 2c 20 6c 6f 67 31 30 4e 2c 20 6e 52 6f  ady, log10N, nRo
1dfa0 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a 20 20  w, cost, used.  
1dfb0 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66    ));..    /* If
1dfc0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1dfd0 68 65 20 62 65 73 74 20 77 65 20 68 61 76 65 20  he best we have 
1dfe0 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65  seen so far, the
1dff0 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20 20  n record this.  
1e000 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69    ** index and i
1e010 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20 70  ts cost in the p
1e020 43 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Cost structure..
1e030 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1e040 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61 67 73  !pIdx || wsFlags
1e050 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73 74 3c  ).     && (cost<
1e060 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c 7c 20  pCost->rCost || 
1e070 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43  (cost<=pCost->rC
1e080 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70 43 6f 73  ost && nRow<pCos
1e090 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20  t->plan.nRow)). 
1e0a0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73     ){.      pCos
1e0b0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b  t->rCost = cost;
1e0c0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
1e0d0 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20  ed = used;.     
1e0e0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f   pCost->plan.nRo
1e0f0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  w = nRow;.      
1e100 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1e110 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 26 77  ags = (wsFlags&w
1e120 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20 20 20  sFlagMask);.    
1e130 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45    pCost->plan.nE
1e140 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 70  q = nEq;.      p
1e150 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1e160 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a  x = pIdx;.    }.
1e170 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1e180 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20   was an INDEXED 
1e190 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1e1a0 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69 6e  only that one in
1e1b0 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  dex is.    ** co
1e1c0 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20  nsidered. */.   
1e1d0 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65   if( pSrc->pInde
1e1e0 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  x ) break;..    
1e1f0 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20 66  /* Reset masks f
1e200 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  or the next inde
1e210 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  x in the loop */
1e220 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
1e230 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
1e240 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
1e250 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
1e260 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
1e270 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  mMask;.  }..  /*
1e280 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1e290 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1e2a0 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52  and the SQLITE_R
1e2b0 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67  everseOrder flag
1e2c0 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68  .  ** is set, th
1e2d0 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  en reverse the o
1e2e0 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e  rder that the in
1e2f0 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e  dex will be scan
1e300 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69  ned.  ** in. Thi
1e310 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70  s is used for ap
1e320 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e  plication testin
1e330 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20  g, to help find 
1e340 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65  cases.  ** where
1e350 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68   application beh
1e360 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f  aviour depends o
1e370 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64  n the (undefined
1e380 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a  ) order that.  *
1e390 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73  * SQLite outputs
1e3a0 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20   rows in in the 
1e3b0 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52  absence of an OR
1e3c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1e3d0 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  */.  if( !pOrder
1e3e0 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  By && pParse->db
1e3f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1e400 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b  _ReverseOrder ){
1e410 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  .    pCost->plan
1e420 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
1e430 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a  E_REVERSE;.  }..
1e440 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
1e450 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c  By || (pCost->pl
1e460 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
1e470 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29 3b 0a  _ORDERBY)==0 );.
1e480 20 20 61 73 73 65 72 74 28 20 70 43 6f 73 74 2d    assert( pCost-
1e490 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
1e4a0 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  || (pCost->plan.
1e4b0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f  wsFlags&WHERE_RO
1e4c0 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20  WID_EQ)==0 );.  
1e4d0 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49  assert( pSrc->pI
1e4e0 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
1e4f0 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  || pCost->plan.u
1e500 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20  .pIdx==0 .      
1e510 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e   || pCost->plan.
1e520 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49  u.pIdx==pSrc->pI
1e530 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48  ndex .  );..  WH
1e540 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74 20  ERETRACE(("best 
1e550 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c  index is: %s\n",
1e560 20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d 3e 70   .    ((pCost->p
1e570 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e580 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
1e590 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20 3a 20  )==0 ? "none" : 
1e5a0 0a 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  .         pCost-
1e5b0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70  >plan.u.pIdx ? p
1e5c0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1e5d0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22  x->zName : "ipk"
1e5e0 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73  ).  ));.  .  bes
1e5f0 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
1e600 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1e610 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
1e620 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20  alid, pOrderBy, 
1e630 70 43 6f 73 74 29 3b 0a 20 20 62 65 73 74 41 75  pCost);.  bestAu
1e640 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
1e650 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
1e660 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f 73 74 29  notReady, pCost)
1e670 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  ;.  pCost->plan.
1e680 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72  wsFlags |= eqTer
1e690 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mMask;.}../*.** 
1e6a0 46 69 6e 64 20 74 68 65 20 71 75 65 72 79 20 70  Find the query p
1e6b0 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e  lan for accessin
1e6c0 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54  g table pSrc->pT
1e6d0 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ab. Write the.**
1e6e0 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
1e6f0 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e   and its cost in
1e700 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74  to the WhereCost
1e710 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64   object supplied
1e720 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74   .** as the last
1e730 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73   parameter. This
1e740 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61   function may ca
1e750 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74  lculate the cost
1e760 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c   of.** both real
1e770 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62   and virtual tab
1e780 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61  le scans..*/.sta
1e790 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
1e7a0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
1e7b0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1e7c0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e7d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1e7e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1e7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e800 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1e810 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1e820 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
1e830 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1e840 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1e850 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1e860 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
1e870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
1e880 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
1e890 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
1e8a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1e8b0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
1e8c0 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
1e8d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
1e8e0 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
1e8f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1e900 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
1e910 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1e920 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
1e930 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
1e940 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
1e950 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
1e960 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1e970 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e980 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
1e990 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
1e9a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
1e9b0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d 20 30  ndex_info *p = 0
1e9c0 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74 75 61  ;.    bestVirtua
1e9d0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1e9e0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
1e9f0 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f  dy, notValid, pO
1ea00 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 26 70  rderBy, pCost,&p
1ea10 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65  );.    if( p->ne
1ea20 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1ea30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ea40 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b  free(p->idxStr);
1ea50 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1ea60 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1ea70 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65  >db, p);.  }else
1ea80 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
1ea90 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
1eaa0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1eab0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
1eac0 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20  alid, pOrderBy, 
1ead0 30 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d  0, pCost);.  }.}
1eae0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
1eaf0 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
1eb00 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
1eb10 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
1eb20 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
1eb30 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
1eb40 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1eb50 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
1eb60 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
1eb70 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
1eb80 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
1eb90 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
1eba0 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
1ebb0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
1ebc0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
1ebd0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
1ebe0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
1ebf0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
1ec00 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
1ec10 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
1ec20 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
1ec30 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1ec40 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
1ec50 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
1ec60 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
1ec70 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
1ec80 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
1ec90 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
1eca0 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
1ecb0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
1ecc0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
1ecd0 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
1ece0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
1ecf0 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
1ed00 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
1ed10 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
1ed20 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
1ed30 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
1ed40 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
1ed50 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
1ed60 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
1ed70 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35  TATION-OF: R-245
1ed80 39 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74  97-58655 No test
1ed90 73 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74  s are done for t
1eda0 65 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a  erms that are.**
1edb0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69   completely sati
1edc0 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73  sfied by indices
1edd0 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
1ede0 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
1edf0 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
1ee00 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
1ee10 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
1ee20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
1ee30 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
1ee40 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
1ee50 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
1ee60 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
1ee70 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
1ee80 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
1ee90 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
1eea0 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
1eeb0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
1eec0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
1eed0 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
1eee0 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
1eef0 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
1ef00 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
1ef10 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
1ef20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
1ef30 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
1ef40 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
1ef50 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
1ef60 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
1ef70 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
1ef80 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
1ef90 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
1efa0 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
1efb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1efc0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
1efd0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1efe0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1eff0 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
1f000 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
1f010 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1f020 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
1f030 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
1f040 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
1f050 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
1f060 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
1f070 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
1f080 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
1f090 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
1f0a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
1f0b0 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
1f0c0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
1f0d0 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
1f0e0 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
1f0f0 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
1f100 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
1f110 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f120 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1f130 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
1f140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1f150 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
1f160 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
1f170 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
1f180 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
1f190 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
1f1a0 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
1f1b0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
1f1c0 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
1f1d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
1f1e0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
1f1f0 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
1f200 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
1f210 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
1f220 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
1f230 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
1f240 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
1f250 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
1f260 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
1f270 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
1f280 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
1f290 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1f2a0 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
1f2b0 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
1f2c0 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
1f2d0 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
1f2e0 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
1f2f0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
1f300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1f310 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1f320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1f330 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
1f340 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
1f350 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f360 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
1f370 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
1f380 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1f390 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1f3a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1f3b0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1f3c0 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
1f3d0 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
1f3e0 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
1f3f0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
1f400 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1f410 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
1f420 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
1f430 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
1f440 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
1f450 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
1f460 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
1f470 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
1f480 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
1f490 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
1f4a0 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
1f4b0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
1f4c0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
1f4d0 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
1f4e0 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
1f4f0 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
1f500 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
1f510 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
1f520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f530 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
1f540 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
1f550 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1f560 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
1f570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f580 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f590 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
1f5a0 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
1f5b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1f5c0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
1f5d0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
1f5e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1f5f0 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
1f600 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
1f610 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
1f620 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
1f630 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
1f640 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
1f650 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
1f660 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
1f670 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
1f680 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
1f690 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
1f6a0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
1f6b0 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
1f6c0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
1f6d0 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
1f6e0 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
1f6f0 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
1f700 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
1f710 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
1f720 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
1f730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
1f740 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
1f750 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
1f760 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
1f770 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
1f780 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
1f790 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1f7a0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
1f7b0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1f7c0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
1f7d0 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
1f7e0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
1f7f0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
1f800 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
1f810 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1f820 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
1f830 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f840 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
1f850 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  on */.  int iTar
1f860 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
1f870 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
1f880 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
1f890 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1f8a0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
1f8b0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
1f8c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1f8d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
1f900 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
1f910 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
1f920 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
1f930 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
1f940 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
1f950 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1f960 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1f970 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1f980 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
1f990 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
1f9a0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
1f9b0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
1f9c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f9d0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
1f9e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f9f0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
1fa00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
1fa10 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
1fa20 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
1fa30 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20  Loop *pIn;..    
1fa40 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
1fa50 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65  TK_IN );.    iRe
1fa60 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
1fa70 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
1fa80 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
1fa90 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20  se, pX, 0);.    
1faa0 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
1fab0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1fac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1fad0 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
1fae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1faf0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1fb00 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
1fb10 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
1fb20 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
1fb30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1fb40 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1fb50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fb60 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
1fb70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
1fb80 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
1fb90 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
1fba0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
1fbb0 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
1fbc0 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
1fbd0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1fc00 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
1fc10 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
1fc20 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
1fc30 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
1fc40 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
1fc50 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
1fc60 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
1fc70 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
1fc80 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
1fc90 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
1fca0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1fcb0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1fcc0 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
1fcd0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
1fce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1fcf0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
1fd00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fd10 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
1fd20 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
1fd30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1fd40 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
1fd50 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
1fd60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fd70 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
1fd80 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  ull, iReg);.    
1fd90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
1fda0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20  vel->u.in.nIn = 
1fdb0 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
1fdc0 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
1fdd0 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
1fde0 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  ;.  return iReg;
1fdf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1fe00 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1fe10 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d  l evaluate all =
1fe20 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
1fe30 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69  ints for an.** i
1fe40 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ndex..**.** For 
1fe50 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
1fe60 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
1fe70 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
1fe80 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
1fe90 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
1fea0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
1feb0 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
1fec0 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
1fed0 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
1fee0 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
1fef0 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
1ff00 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ff10 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
1ff20 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
1ff30 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
1ff40 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
1ff50 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
1ff60 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
1ff70 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
1ff80 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
1ff90 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
1ffa0 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
1ffb0 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
1ffc0 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
1ffd0 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
1ffe0 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a  will be stored.*
1fff0 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65  * in consecutive
20000 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
20010 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
20020 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
20030 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
20040 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
20050 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20   above nEq==2.  
20060 42 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74  But this subrout
20070 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
20080 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45  y value.** of nE
20090 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20  q including 0.  
200a0 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20  If nEq==0, this 
200b0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c  routine is nearl
200c0 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  y a no-op..** Th
200d0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20  e only thing it 
200e0 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65  does is allocate
200f0 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65   the pLevel->iMe
20100 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  m memory cell an
20110 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65  d.** compute the
20120 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
20130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20140 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f  tine always allo
20150 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f  cates at least o
20160 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  ne memory cell a
20170 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  nd returns.** th
20180 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
20190 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65  memory cell. The
201a0 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
201b0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
201c0 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
201d0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74  emory cell to st
201e0 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
201f0 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
20200 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
20210 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
20220 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
20230 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
20240 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
20250 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
20260 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
20270 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
20280 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
20290 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
202a0 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
202b0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
202c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
202d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
202e0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
202f0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
20300 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
20310 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
20320 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
20330 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
20340 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
20350 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
20360 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
20370 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
20380 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
20390 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
203a0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
203b0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
203c0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
203d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
203e0 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
203f0 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
20400 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
20410 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
20420 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
20430 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
20440 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
20450 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
20460 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
20470 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
20480 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
20490 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
204a0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
204b0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
204c0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
204d0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
204e0 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
204f0 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
20500 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
20510 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
20520 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
20530 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
20540 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
20550 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
20560 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
20570 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
20580 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
20590 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
205a0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
205b0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
205c0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
205d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
205e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
205f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
20600 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
20610 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
20620 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
20630 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
20640 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
20650 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
20660 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
20670 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
20680 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
20690 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
206a0 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
206b0 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
206c0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
206d0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
206e0 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
206f0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
20700 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
20710 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
20720 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
20730 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
20740 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
20750 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
20760 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54  plan.nEq;   /* T
20770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
20780 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
20790 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56  s to code */.  V
207a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
207b0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
207c0 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
207d0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
207e0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20800 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
20810 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
20820 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  op */.  int iCur
20830 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
20840 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur;   /* The cur
20850 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
20860 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
20870 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
20880 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
20890 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
208a0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
208d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
208e0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
208f0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
20900 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
20910 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
20920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20930 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
20940 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
20950 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
20980 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
20990 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
209a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
209b0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
209c0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
209d0 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  x. */.  assert( 
209e0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
209f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
20a00 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d  EXED );.  pIdx =
20a10 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
20a20 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  pIdx;..  /* Figu
20a30 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
20a40 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
20a50 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
20a60 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
20a70 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
20a80 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
20a90 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c  .  nReg = pLevel
20aa0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78  ->plan.nEq + nEx
20ab0 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
20ac0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
20ad0 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
20ae0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
20af0 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64  ->db, sqlite3Ind
20b00 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
20b10 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21   pIdx));.  if( !
20b20 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72  zAff ){.    pPar
20b30 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
20b40 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iled = 1;.  }.. 
20b50 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
20b60 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
20b70 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
20b80 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
20b90 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
20ba0 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
20bb0 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
20bc0 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
20bd0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
20be0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
20bf0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
20c00 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
20c10 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c  l->plan.wsFlags,
20c20 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
20c30 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20  NEVER(pTerm==0) 
20c40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20  ) break;.    /* 
20c50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72  The following tr
20c60 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77  ue for indices w
20c70 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  ith redundant co
20c80 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45  lumns. .    ** E
20c90 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  x: CREATE INDEX 
20ca0 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b  i1 ON t1(a,b,a);
20cb0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20cc0 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20  1 WHERE a=0 AND 
20cd0 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74  b=0; */.    test
20ce0 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74  case( (pTerm->wt
20cf0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
20d00 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  ED)!=0 );.    te
20d10 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
20d20 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20d30 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
20d40 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
20d50 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
20d60 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
20d70 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
20d80 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
20d90 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
20da0 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
20db0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
20dc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
20dd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
20de0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
20df0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
20e00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
20e30 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
20e40 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
20e50 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
20e60 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
20e70 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
20e80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20e90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
20ea0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
20eb0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
20ec0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
20ed0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
20ee0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
20ef0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
20f00 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
20f10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20f20 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
20f30 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
20f40 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
20f50 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
20f60 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
20f70 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
20f80 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
20f90 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
20fa0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
20fb0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
20fc0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
20fd0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
20fe0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20ff0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
21000 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
21010 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
21020 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
21030 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
21040 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
21050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
21060 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
21070 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
21080 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
21090 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
210a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
210b0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
210c0 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
210d0 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
210e0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
210f0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
21100 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
21110 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
21120 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
21130 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
21140 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
21150 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
21160 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
21170 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
21180 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
21190 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
211a0 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
211b0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
211c0 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
211d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
211e0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
211f0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
21200 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
21210 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
21220 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
21230 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
21240 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
21250 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21260 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
21270 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
21280 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
21290 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
212a0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
212b0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
212c0 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
212d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
212e0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
212f0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
21300 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21310 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
21320 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
21330 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
21340 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
21350 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
21360 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
21370 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
21380 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
21390 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
213a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
213b0 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
213c0 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
213d0 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
213e0 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
213f0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
21400 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
21410 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
21420 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
21430 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
21440 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
21450 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
21460 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
21470 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
21480 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
21490 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
214a0 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
214b0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
214c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
214d0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
214e0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
214f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
21500 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
21510 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
21520 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
21530 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
21540 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
21550 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
21560 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
21570 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
21580 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
21590 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
215a0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
215b0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
215c0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
215d0 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
215e0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
215f0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
21600 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
21610 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
21620 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
21630 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
21640 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
21650 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
21660 62 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  b, WhereLevel *p
21670 4c 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54  Level, Table *pT
21680 61 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e  ab){.  WherePlan
21690 20 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65   *pPlan = &pLeve
216a0 6c 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78  l->plan;.  Index
216b0 20 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e   *pIndex = pPlan
216c0 2d 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20  ->u.pIdx;.  int 
216d0 6e 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71  nEq = pPlan->nEq
216e0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
216f0 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
21700 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->aCol;.  int
21710 20 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e   *aiColumn = pIn
21720 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20  dex->aiColumn;. 
21730 20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a   StrAccum txt;..
21740 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
21750 28 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20  (pPlan->wsFlags 
21760 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
21770 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
21780 49 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  IT))==0 ){.    r
21790 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
217a0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
217b0 69 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53  it(&txt, 0, 0, S
217c0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
217d0 29 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62  );.  txt.db = db
217e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
217f0 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20  cumAppend(&txt, 
21800 22 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28  " (", 2);.  for(
21810 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29  i=0; i<nEq; i++)
21820 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
21830 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
21840 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69   aCol[aiColumn[i
21850 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a  ]].zName, "=");.
21860 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
21870 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61  if( pPlan->wsFla
21880 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
21890 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  IT ){.    explai
218a0 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74  nAppendTerm(&txt
218b0 2c 20 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69 43 6f  , i++, aCol[aiCo
218c0 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20  lumn[j]].zName, 
218d0 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
218e0 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
218f0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
21900 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  {.    explainApp
21910 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c  endTerm(&txt, i,
21920 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
21930 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29 3b 0a  ]].zName, "<");.
21940 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
21950 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
21960 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
21970 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
21980 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
21990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
219a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
219b0 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
219c0 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
219d0 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
219e0 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
219f0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
21a00 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
21a10 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
21a20 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
21a30 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
21a40 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
21a50 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
21a60 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
21a70 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
21a80 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
21a90 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
21aa0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
21ab0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
21ac0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
21ad0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
21ae0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
21af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
21b00 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
21b10 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
21b20 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
21b30 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
21b40 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
21b50 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
21b60 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
21b70 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b90 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
21ba0 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
21bb0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
21bc0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
21bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
21be0 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
21bf0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
21c00 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
21c10 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
21c20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
21c30 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
21c40 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
21c50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
21c60 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
21c70 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76  u32 flags = pLev
21c80 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
21c90 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
21ca0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
21cb0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
21cc0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
21cd0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
21ce0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
21cf0 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
21d00 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
21d10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21d20 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
21d30 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
21d40 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
21d50 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Msg;            
21d60 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
21d70 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74  o add to EQP out
21d80 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  put */.    sqlit
21d90 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20  e3_int64 nRow;  
21da0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
21db0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  cted number of r
21dc0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 73  ows visited by s
21dd0 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  can */.    int i
21de0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
21df0 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65  lectId;  /* Sele
21e00 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74  ct id (left-most
21e10 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20   output column) 
21e20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61  */.    int isSea
21e30 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  rch;            
21e40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
21e50 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65   a SEARCH. False
21e60 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20   for SCAN. */.. 
21e70 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
21e80 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
21e90 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
21ea0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
21eb0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
21ec0 20 69 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65   isSearch = (pLe
21ed0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29  vel->plan.nEq>0)
21ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
21ef0 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
21f00 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
21f10 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
21f20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77             || (w
21f30 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
21f40 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
21f50 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29  RE_ORDERBY_MAX))
21f60 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ;..    zMsg = sq
21f70 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
21f80 20 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f   "%s", isSearch?
21f90 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29  "SEARCH":"SCAN")
21fa0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
21fb0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
21fc0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
21fd0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
21fe0 67 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20  g, "%s SUBQUERY 
21ff0 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d  %d", zMsg,pItem-
22000 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  >iSelectId);.   
22010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d   }else{.      zM
22020 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
22030 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
22040 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d  %s TABLE %s", zM
22050 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  sg, pItem->zName
22060 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
22070 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
22080 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
22090 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
220a0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53  db, zMsg, "%s AS
220b0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
220c0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
220d0 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
220e0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
220f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
22100 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70  ar *zWhere = exp
22110 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64  lainIndexRange(d
22120 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d  b, pLevel, pItem
22130 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
22140 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
22150 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
22160 22 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e  "%s USING %s%sIN
22170 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67  DEX%s%s%s", zMsg
22180 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66  , .          ((f
22190 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
221a0 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41  P_INDEX)?"AUTOMA
221b0 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  TIC ":""),.     
221c0 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
221d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22  HERE_IDX_ONLY)?"
221e0 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a  COVERING ":""),.
221f0 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
22200 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
22210 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20  NDEX)?"":" "),. 
22220 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
22230 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
22240 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d  DEX)?"": pLevel-
22250 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
22260 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
22270 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
22280 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
22290 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b  ree(db, zWhere);
222a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
222b0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
222c0 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
222d0 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
222e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
222f0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
22300 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e  sg, "%s USING IN
22310 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
22320 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20  Y", zMsg);..    
22330 20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52    if( flags&WHER
22340 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
22350 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22360 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
22370 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
22380 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  d=?)", zMsg);.  
22390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
223a0 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f  lags&WHERE_BOTH_
223b0 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f  LIMIT)==WHERE_BO
223c0 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TH_LIMIT ){.    
223d0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
223e0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
223f0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
22400 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c  ? AND rowid<?)",
22410 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65   zMsg);.      }e
22420 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48  lse if( flags&WH
22430 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
22440 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
22450 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22460 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
22470 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid>?)", zMsg);
22480 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22490 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50   flags&WHERE_TOP
224a0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
224b0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
224c0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
224d0 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29  g, "%s (rowid<?)
224e0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
224f0 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
22500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22510 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73  UALTABLE.    els
22520 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57  e if( (flags & W
22530 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
22540 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)!=0 ){.      s
22550 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
22560 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c  o *pVtabIdx = pL
22570 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  evel->plan.u.pVt
22580 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73  abIdx;.      zMs
22590 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
225a0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
225b0 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
225c0 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
225d0 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
225e0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
225f0 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
22600 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  ->idxStr);.    }
22610 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
22620 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52  wctrlFlags&(WHER
22630 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48  E_ORDERBY_MIN|WH
22640 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29  ERE_ORDERBY_MAX)
22650 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
22660 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
22670 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
22680 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77  IN );.      nRow
22690 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
226a0 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73  .      nRow = (s
226b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65  qlite3_int64)pLe
226c0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
226d0 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d      }.    zMsg =
226e0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
226f0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28  (db, zMsg, "%s (
22700 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d  ~%lld rows)", zM
22710 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73  sg, nRow);.    s
22720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22730 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
22740 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72  iId, iLevel, iFr
22750 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  om, zMsg, P4_DYN
22760 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
22770 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
22780 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77  ainOneScan(u,v,w
22790 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
227a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
227b0 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  PLAIN */.../*.**
227c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
227d0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
227e0 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
227f0 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
22800 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
22810 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
22820 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
22830 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
22840 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
22850 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
22860 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
22870 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
22880 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
22890 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
228a0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
228b0 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
228c0 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
228d0 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
228e0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
228f0 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ags,      /* One
22900 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
22910 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
22920 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
22930 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
22940 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20  dy     /* Which 
22950 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65  tables are curre
22960 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a  ntly available *
22970 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  /.){.  int j, k;
22980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22990 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
229a0 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
229b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
229c0 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
229d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
229e0 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20   addrNxt;       
229f0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75    /* Where to ju
22a00 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  mp to continue w
22a10 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
22a20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  case */.  int om
22a30 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f  itTable;       /
22a40 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65  * True if we use
22a50 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   the index only 
22a60 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
22a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22a80 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
22a90 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
22aa0 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  order */.  Where
22ab0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
22ac0 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76  /* The where lev
22ad0 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  el to be coded *
22ae0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
22af0 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f  *pWC;    /* Deco
22b00 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65  mposition of the
22b10 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c   entire WHERE cl
22b20 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  ause */.  WhereT
22b30 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
22b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
22b50 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
22b60 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
22b70 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
22b80 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
22b90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64   context */.  Vd
22ba0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22bc0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
22bd0 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
22be0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
22bf0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22c00 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
22c10 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
22c20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
22c30 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
22c60 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
22c70 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
22c80 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
22c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
22ca0 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
22cb0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
22cc0 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
22cd0 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
22ce0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
22cf0 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
22d00 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
22d10 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
22d20 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
22d30 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
22d40 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
22d50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
22d60 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
22d70 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
22d80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
22d90 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f  ;.  pWC = pWInfo
22da0 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20  ->pWC;.  pLevel 
22db0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
22dc0 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d  vel];.  pTabItem
22dd0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62   = &pWInfo->pTab
22de0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
22df0 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d  iFrom];.  iCur =
22e00 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
22e10 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c  or;.  bRev = (pL
22e20 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
22e30 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52  gs & WHERE_REVER
22e40 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61  SE)!=0;.  omitTa
22e50 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  ble = (pLevel->p
22e60 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
22e70 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
22e80 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
22e90 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
22ea0 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29  ERE_FORCE_TABLE)
22eb0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ==0;..  /* Creat
22ec0 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65  e labels for the
22ed0 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f   "break" and "co
22ee0 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74  ntinue" instruct
22ef0 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ions.  ** for th
22f00 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
22f10 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b   Jump to addrBrk
22f20 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
22f30 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75   a loop..  ** Ju
22f40 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f  mp to cont to go
22f50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
22f60 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
22f70 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
22f80 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  oop..  **.  ** W
22f90 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20  hen there is an 
22fa0 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20  IN operator, we 
22fb0 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64  also have a "add
22fc0 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  rNxt" label that
22fd0 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63  .  ** means to c
22fe0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
22ff0 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63   next IN value c
23000 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65  ombination.  Whe
23010 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65  n.  ** there are
23020 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   no IN operators
23030 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69   in the constrai
23040 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78  nts, the "addrNx
23050 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73  t" label.  ** is
23060 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64   the same as "ad
23070 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61  drBrk"..  */.  a
23080 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
23090 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65  >addrBrk = pLeve
230a0 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c  l->addrNxt = sql
230b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
230c0 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74  l(v);.  addrCont
230d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
230e0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
230f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
23100 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
23110 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
23120 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
23130 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
23140 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  nd.  ** initiali
23150 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
23160 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
23170 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
23180 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77  hes any.  ** row
23190 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
231a0 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
231b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65    */.  if( pLeve
231c0 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
231d0 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
231e0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
231f0 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 ){.    pLevel-
23200 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70  >iLeftJoin = ++p
23210 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23230 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
23240 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 0, pLevel->iLe
23250 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62  ftJoin);.    Vdb
23260 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
23270 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
23280 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
23290 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
232a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
232b0 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65  ABLE.  if(  (pLe
232c0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
232d0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
232e0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
232f0 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68    /* Case 0:  Th
23300 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
23310 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
23320 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
23330 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
23340 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
23350 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
23360 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
23370 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
23380 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
23390 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
233a0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
233b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
233c0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
233d0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  int nConstraint 
233e0 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e  = pVtabIdx->nCon
233f0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72  straint;.    str
23400 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
23410 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
23420 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
23460 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  abIdx->aConstrai
23470 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e  ntUsage;.    con
23480 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
23490 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
234a0 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20  nt *aConstraint 
234b0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
234f0 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71  straint;..    sq
23500 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
23510 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
23520 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
23530 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
23540 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
23550 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
23560 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
23570 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
23580 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69  k=0; k<nConstrai
23590 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; k++){.      
235a0 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e    if( aUsage[k].
235b0 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a  argvIndex==j ){.
235c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
235d0 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
235e0 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
235f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
23600 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
23610 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d  se, pWC->a[iTerm
23620 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ].pExpr->pRight,
23630 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20   iReg+j+1);.    
23640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23660 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e       if( k==nCon
23670 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
23680 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
236a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61  OP_Integer, pVta
236b0 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52  bIdx->idxNum, iR
236c0 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
236d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
236e0 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69  _Integer, j-1, i
236f0 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Reg+1);.    sqli
23700 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
23710 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
23720 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67  r, addrBrk, iReg
23730 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53  , pVtabIdx->idxS
23740 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
23750 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
23760 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  dx->needToFreeId
23770 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54  xStr ? P4_MPRINT
23780 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
23790 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65      pVtabIdx->ne
237a0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
237b0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
237c0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
237d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
237e0 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29  aUsage[j].omit )
237f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  {.        int iT
23800 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
23810 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[j].iTermOffset
23820 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
23830 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70  eTerm(pLevel, &p
23840 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20  WC->a[iTerm]);. 
23850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23860 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
23870 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76  _VNext;.    pLev
23880 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
23890 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
238a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
238b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
238c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
238d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  pRange(pParse, i
238e0 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  Reg, nConstraint
238f0 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
23900 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
23910 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  rse, 1);.  }else
23920 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23930 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
23940 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c  BLE */..  if( pL
23950 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
23960 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
23970 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _EQ ){.    /* Ca
23980 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
23990 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
239a0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
239b0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
239c0 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
239d0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
239e0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
239f0 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
23a00 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
23a10 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
23a20 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
23a30 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
23a40 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
23a50 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
23a60 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
23a70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
23a80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
23a90 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
23aa0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
23ab0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
23ac0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73  O_IN, 0);.    as
23ad0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
23ae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
23af0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
23b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
23b10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
23b20 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65  iCur );.    asse
23b30 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
23b40 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
23b50 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23b60 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
23b70 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
23b80 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69  5-11662 */.    i
23b90 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45  RowidReg = codeE
23ba0 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
23bb0 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
23bc0 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  l, iReleaseReg);
23bd0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
23be0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
23bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23c00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
23c10 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
23c20 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
23c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23c40 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
23c50 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74  s, iCur, addrNxt
23c60 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
23c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23c80 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
23c90 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
23ca0 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
23cb0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
23cc0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
23cd0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
23ce0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
23cf0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
23d00 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
23d10 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
23d20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  2:  We have an i
23d30 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
23d40 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
23d50 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
23d60 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73    */.    int tes
23d70 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
23d80 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20     int start;.  
23d90 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75    int memEndValu
23da0 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65  e = 0;.    Where
23db0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
23dc0 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  End;..    assert
23dd0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
23de0 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66  ;.    pStart = f
23df0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
23e00 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
23e10 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
23e20 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e  ;.    pEnd = fin
23e30 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
23e40 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
23e50 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
23e60 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
23e70 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
23e80 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61  tart;.      pSta
23e90 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
23ea0 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20   pEnd = pTerm;. 
23eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
23ec0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
23ed0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
23ee0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23ef0 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65  sion that define
23f00 73 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  s the start boun
23f10 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  d */.      int r
23f20 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20  1, rTemp;       
23f30 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f   /* Registers fo
23f40 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74  r holding the st
23f50 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a  art boundary */.
23f60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
23f70 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
23f80 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65   maps TK_xx code
23f90 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e  s into correspon
23fa0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73  ding .      ** s
23fb0 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74  eek opcodes.  It
23fc0 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61   depends on a pa
23fd0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e  rticular orderin
23fe0 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20  g of TK_xx.     
23ff0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
24000 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b  u8 aMoveOp[] = {
24010 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
24020 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_GT */  OP_Seek
24030 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Gt,.           /
24040 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53  * TK_LE */  OP_S
24050 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20  eekLe,.         
24060 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f    /* TK_LT */  O
24070 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20  P_SeekLt,.      
24080 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f       /* TK_GE */
24090 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20    OP_SeekGe.    
240a0 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72    };.      asser
240b0 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b  t( TK_LE==TK_GT+
240c0 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b  1 );      /* Mak
240d0 65 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72  e sure the order
240e0 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ing.. */.      a
240f0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
24100 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+2 );      /*
24110 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f    ... of the TK_
24120 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a  xx values... */.
24130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
24140 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20  _GE==TK_GT+3 ); 
24150 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20       /*  ... is 
24160 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20  correcct. */..  
24170 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
24180 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20  tart->wtFlags & 
24190 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
241a0 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
241b0 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58  1662 */.      pX
241c0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
241d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
241e0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
241f0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
24200 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
24210 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
24220 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24230 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
24240 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
24250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24260 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
24270 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
24280 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
24290 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
242a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
242b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
242c0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
242d0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
242e0 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
242f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24300 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
24310 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
24320 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
24330 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
24340 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
24350 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
24360 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
24370 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
24380 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
24390 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
243a0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
243b0 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
243c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
243d0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
243e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
243f0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
24400 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ur );.      test
24410 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
24420 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
24430 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
24440 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
24450 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20      memEndValue 
24460 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24480 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
24490 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45  pX->pRight, memE
244a0 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ndValue);.      
244b0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
244c0 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
244d0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  GT ){.        te
244e0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
244f0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
24500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24510 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
24520 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
24530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
24540 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
24550 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a  l, pEnd);.    }.
24560 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
24570 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
24580 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65  dr(v);.    pLeve
24590 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
245a0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
245b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
245c0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
245d0 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
245e0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d  .    if( pStart=
245f0 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b  =0 && pEnd==0 ){
24600 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
24610 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
24620 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
24630 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  TEP;.    }else{.
24640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
24650 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
24660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
24670 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
24680 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
24690 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
246a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
246b0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
246c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
246d0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
246e0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
246f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24700 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
24710 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
24720 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
24730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24740 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d  Op3(v, testOp, m
24750 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72  emEndValue, addr
24760 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Brk, iRowidReg);
24770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24780 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
24790 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
247a0 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   | SQLITE_JUMPIF
247b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NULL);.    }.  }
247c0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
247d0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
247e0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
247f0 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
24800 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43  _EQ) ){.    /* C
24810 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73  ase 3: A scan us
24820 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
24830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
24840 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c      The WHERE cl
24850 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ause may contain
24860 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71   zero or more eq
24870 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20  uality .    **  
24880 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d         terms ("=
24890 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
248a0 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72  tors) that refer
248b0 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a   to the N.    **
248c0 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f           left-mo
248d0 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  st columns of th
248e0 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20  e index. It may 
248f0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  also contain.   
24900 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71   **         ineq
24910 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
24920 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20  ts (>, <, >= or 
24930 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  <=) on the index
24940 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
24950 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d    column that im
24960 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
24970 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69  s the N equaliti
24980 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a  es. Only .    **
24990 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
249a0 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
249b0 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
249c0 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
249d0 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ust.    **      
249e0 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
249f0 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
24a00 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
24a10 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   if the .    ** 
24a20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73          index is
24a30 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65   on (x,y,z), the
24a40 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
24a50 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20  clauses are all 
24a60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
24a70 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a  optimized:.    *
24a80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
24a90 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20      x=5.    **  
24aa0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
24ab0 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y=10.    **   
24ac0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
24ad0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
24ae0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
24af0 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20  y>5 AND y<10.   
24b00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
24b10 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
24b20 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <=10.    **.    
24b30 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a  **         The z
24b40 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20  <10 term of the 
24b50 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74  following cannot
24b60 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20   be used, only. 
24b70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
24b80 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20  e x=5 term:.    
24b90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
24ba0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31       x=5 AND z<1
24bb0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
24bc0 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65          N may be
24bd0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
24be0 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  re inequality co
24bf0 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
24c00 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
24c10 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
24c20 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
24c30 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
24c40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
24c50 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a  ast one..    **.
24c60 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
24c70 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
24c80 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
24c90 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
24ca0 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  ause.    **     
24cb0 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20      constraints 
24cc0 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20  but an index is 
24cd0 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c  selected anyway,
24ce0 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   in order.    **
24cf0 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63           to forc
24d00 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64  e the output ord
24d10 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f  er to conform to
24d20 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20   an ORDER BY..  
24d30 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69    */  .    stati
24d40 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
24d50 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
24d60 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
24d70 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
24d80 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
24d90 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
24da0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
24db0 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
24dc0 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
24dd0 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
24de0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
24df0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
24e00 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
24e10 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
24e20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
24e30 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
24e40 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
24e50 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
24e60 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
24e70 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
24e80 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
24e90 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
24ea0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
24eb0 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
24ec0 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
24ed0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
24ee0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
24ef0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
24f00 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
24f10 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
24f20 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
24f30 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
24f40 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69      };.    stati
24f50 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f  c const u8 aEndO
24f60 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50  p[] = {.      OP
24f70 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  _Noop,          
24f80 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63     /* 0: (!end_c
24f90 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20  onstraints) */. 
24fa0 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20       OP_IdxGE,  
24fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
24fc0 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
24fd0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
24fe0 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20      OP_IdxLT    
24ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
25000 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
25010 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  && bRev) */.    
25020 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  };.    int nEq =
25030 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
25040 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  q;  /* Number of
25050 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
25060 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e  */.    int isMin
25070 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Query = 0;      
25080 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
25090 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53  s an optimized S
250a0 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a  ELECT min(x).. *
250b0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73  /.    int regBas
250c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
250d0 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
250e0 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73  ter holding cons
250f0 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f  traint values */
25100 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20  .    int r1;    
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74    /* Temp regist
25130 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  er */.    WhereT
25140 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74  erm *pRangeStart
25150 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61   = 0;  /* Inequa
25160 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
25170 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a  at range start *
25180 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
25190 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
251a0 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
251b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
251c0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
251d0 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251f0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
25200 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
25210 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
25220 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20   endEq;         
25230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25240 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75  e if range end u
25250 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
25260 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
25270 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
25280 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
25290 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
252a0 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ained */.    int
252b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
252c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
252d0 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
252e0 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49  t terms */.    I
252f0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
25300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25310 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c  he index we will
25320 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20   be using */.   
25330 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25350 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
25360 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
25370 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  /.    int nExtra
25380 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
25390 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
253a0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
253b0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e  needed */.    in
253c0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
253d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
253e0 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65  struction opcode
253f0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
25400 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20  tartAff;        
25410 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
25420 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61   for start of ra
25430 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  nge constraint *
25440 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64  /.    char *zEnd
25450 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
25460 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
25470 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20  or end of range 
25480 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20  constraint */.. 
25490 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
254a0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
254b0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
254c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
254d0 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f    k = pIdx->aiCo
254e0 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f  lumn[nEq];     /
254f0 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65  * Column for ine
25500 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25510 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  nts */..    /* I
25520 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
25530 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
25540 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
25550 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
25560 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
25570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
25580 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
25590 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
255a0 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
255b0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
255c0 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
255d0 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
255e0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
255f0 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
25600 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
25610 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
25620 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
25630 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
25640 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
25650 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
25660 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
25670 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
25680 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
25690 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
256a0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
256b0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
256c0 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
256d0 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
256e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
256f0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
25700 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
25710 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70     && (pLevel->p
25720 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
25730 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20  E_ORDERBY).     
25740 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
25750 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
25760 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
25770 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
25780 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
25790 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
257a0 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
257b0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
257c0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
257d0 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
257e0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
257f0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
25800 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
25810 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
25820 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
25830 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
25840 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
25850 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
25860 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
25870 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
25880 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
25890 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
258a0 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
258b0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
258c0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
258d0 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
258e0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
258f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
25900 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
25910 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
25920 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
25930 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
25940 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
25950 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
25960 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20   (WO_GT|WO_GE), 
25970 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
25980 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
25990 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
259a0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
259b0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
259c0 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
259d0 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
259e0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
259f0 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
25a00 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
25a10 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
25a20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
25a30 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
25a40 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
25a50 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
25a60 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  s(.        pPars
25a70 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20  e, pLevel, pWC, 
25a80 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61  notReady, nExtra
25a90 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a  Reg, &zStartAff.
25aa0 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41      );.    zEndA
25ab0 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
25ac0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
25ad0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
25ae0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
25af0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
25b00 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
25b10 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
25b20 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
25b30 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
25b40 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
25b50 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
25b60 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
25b70 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
25b80 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
25b90 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
25ba0 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
25bb0 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
25bc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45     */.    if( nE
25bd0 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  q<pIdx->nColumn 
25be0 26 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  && bRev==(pIdx->
25bf0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
25c00 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20  =SQLITE_SO_ASC) 
25c10 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
25c20 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
25c30 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
25c40 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
25c50 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
25c60 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
25c70 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
25c80 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65   WO_LE );.    te
25c90 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
25ca0 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
25cb0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
25cc0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_GE );.    tes
25cd0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
25ce0 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
25cf0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
25d00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
25d10 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
25d20 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
25d30 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
25d40 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
25d50 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
25d60 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
25d70 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
25d80 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
25d90 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
25da0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
25db0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
25dc0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
25dd0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
25de0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
25df0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
25e00 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
25e10 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
25e20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
25e30 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
25e40 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
25e50 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
25e60 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
25e70 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
25e80 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
25e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25ea0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
25eb0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
25ec0 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  q);.      if( (p
25ed0 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
25ee0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
25ef0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25f00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
25f10 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
25f20 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
25f30 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
25f40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
25f50 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
25f60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
25f70 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
25f80 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
25f90 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
25fa0 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
25fb0 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
25fc0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
25fd0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
25fe0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
25ff0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
26000 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
26010 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
26020 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
26030 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
26040 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
26050 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
26060 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
26070 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
26080 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
26090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
260a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
260b0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
260c0 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
260d0 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
260e0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
260f0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
26100 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
26110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
26120 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
26130 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
26140 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
26150 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
26160 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
26170 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
26180 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
26190 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a  ( isMinQuery ){.
261a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
261b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
261c0 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
261d0 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
261e0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
261f0 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
26200 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
26210 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
26220 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
26230 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
26240 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
26250 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  nt, zStartAff);.
26260 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
26270 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
26280 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
26290 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
262a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
262b0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
262c0 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
262d0 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
262e0 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
262f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26300 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b  op==OP_SeekGt );
26310 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
26320 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a  p==OP_SeekGe );.
26330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
26340 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
26350 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26360 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20  =OP_SeekLt );.  
26370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26380 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
26390 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
263a0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
263b0 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  aint);..    /* L
263c0 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
263d0 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
263e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
263f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
26400 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
26410 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
26420 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
26430 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
26440 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
26450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
26460 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
26470 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
26480 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
26490 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
264a0 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
264b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
264c0 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
264d0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
264e0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
264f0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
26500 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
26510 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26520 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
26530 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
26540 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
26550 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
26560 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66       if( zEndAff
26570 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26580 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
26590 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
265a0 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  EndAff[nEq])==SQ
265b0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
265c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
265d0 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
265e0 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
265f0 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
26600 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
26610 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
26620 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
26630 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
26640 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
26650 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
26660 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
26670 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
26680 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
26690 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
266a0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
266b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
266c0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
266d0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
266e0 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20  , zEndAff[nEq]) 
266f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  ){.          zEn
26700 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
26710 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
26720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
26730 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79  .      codeApply
26740 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
26750 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c   regBase, nEq+1,
26760 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20   zEndAff);.     
26770 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
26780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26790 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
267a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
267b0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
267c0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
267d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
267e0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
267f0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
26800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
26810 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41  Parse->db, zEndA
26820 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70  ff);..    /* Top
26830 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64   of the loop bod
26840 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d  y */.    pLevel-
26850 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
26860 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26870 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
26880 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  f the index curs
26890 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65  or is past the e
268a0 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  nd of the range.
268b0 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e   */.    op = aEn
268c0 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c  dOp[(pRangeEnd |
268d0 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52  | nEq) * (1 + bR
268e0 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61  ev)];.    testca
268f0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20  se( op==OP_Noop 
26900 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26910 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b   op==OP_IdxGE );
26920 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
26930 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20  p==OP_IdxLT );. 
26940 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f     if( op!=OP_No
26950 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
26960 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
26970 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
26980 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
26990 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
269a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
269b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e  beChangeP5(v, en
269c0 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b  dEq!=bRev ?1:0);
269d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
269e0 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
269f0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
26a00 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
26a10 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  he value.    ** 
26a20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
26a30 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65  umn that the ine
26a40 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e  quality contrain
26a50 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  s is not NULL.. 
26a60 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
26a70 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
26a80 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
26a90 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  e loop..    */. 
26aa0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
26ab0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
26ac0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26ad0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
26ae0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
26af0 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74  M_LIMIT );.    t
26b00 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
26b10 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
26b20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
26b30 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  );.    if( (pLev
26b40 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
26b50 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49   & (WHERE_BTM_LI
26b60 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
26b70 4d 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  MIT))!=0 ){.    
26b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26b90 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
26ba0 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20  , iIdxCur, nEq, 
26bb0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
26bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26bd0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61  OP_IsNull, r1, a
26be0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a  ddrCont);.    }.
26bf0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
26c00 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26c10 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  , r1);..    /* S
26c20 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75  eek the table cu
26c30 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65  rsor, if require
26c40 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65  d */.    disable
26c50 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
26c60 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64  ngeStart);.    d
26c70 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
26c80 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
26c90 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
26ca0 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  e ){.      iRowi
26cb0 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
26cc0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
26cd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
26ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
26d00 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
26d10 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
26d20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
26d30 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
26d40 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
26d50 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
26d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26d70 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c  , OP_Seek, iCur,
26d80 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a   iRowidReg);  /*
26d90 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a   Deferred seek *
26da0 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
26db0 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
26dc0 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
26dd0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
26de0 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
26df0 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
26e00 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e  terms made redun
26e10 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65  dant by the inde
26e20 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20  x range scan..  
26e30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
26e40 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
26e50 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
26e60 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
26e70 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
26e80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
26e90 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
26ea0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
26eb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26ec0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
26ed0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
26ee0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
26ef0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 61 73 73  iIdxCur;.    ass
26f00 65 72 74 28 20 28 57 48 45 52 45 5f 55 4e 51 5f  ert( (WHERE_UNQ_
26f10 57 41 4e 54 45 44 3e 3e 33 30 29 3d 3d 31 20 29  WANTED>>30)==1 )
26f20 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33  ;.    pLevel->p3
26f30 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
26f40 2e 77 73 46 6c 61 67 73 3e 3e 33 30 29 26 31 3b  .wsFlags>>30)&1;
26f50 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
26f60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
26f70 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
26f80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
26f90 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
26fa0 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
26fb0 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f   /* Case 4:  Two
26fc0 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
26fd0 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ely indexed term
26fe0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
26ff0 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
27000 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
27010 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
27020 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64  TABLE t1(a,b,c,d
27030 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
27040 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
27050 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(a);.    **   C
27060 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
27070 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20  N t1(b);.    ** 
27080 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
27090 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20  3 ON t1(c);.    
270a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
270b0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
270c0 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52  RE a=5 OR b=7 OR
270d0 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29   (c=11 AND d=13)
270e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
270f0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74  n the example, t
27100 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 69  here are three i
27110 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e  ndexed terms con
27120 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20  nected by OR..  
27130 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20    ** The top of 
27140 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c  the loop looks l
27150 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
27160 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
27170 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
27190 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
271a0 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20  n reg 1.    **. 
271b0 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20     ** Then, for 
271c0 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65 72  each indexed ter
271d0 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  m, the following
271e0 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  . The arguments 
271f0 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74  to.    ** RowSet
27200 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74 68  Test are such th
27210 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  at the rowid of 
27220 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
27230 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  is inserted.    
27240 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53  ** into the RowS
27250 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  et. If it is alr
27260 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f  eady present, co
27270 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a  ntrol skips the.
27280 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63      ** Gosub opc
27290 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74  ode and jumps st
272a0 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f  raight to the co
272b0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
272c0 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20  WhereEnd()..    
272d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
272e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
272f0 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a  in(<term>).    *
27300 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53 65  *          RowSe
27310 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20 20  tTest           
27320 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20         # Insert 
27330 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65  rowid into rowse
27340 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
27350 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20 41    Gosub      2 A
27360 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
27370 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
27380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
27390 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f  ollowing the abo
273a0 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d  ve, code to term
273b0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
273c0 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72  Label A, the tar
273d0 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  get.    ** of th
273e0 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a  e Gosub above, j
273f0 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74  umps to the inst
27400 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66  ruction right af
27410 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20  ter the Goto..  
27420 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
27430 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20       Null       
27440 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
27450 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73   # Zero the rows
27460 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20  et in reg 1.    
27470 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f  **          Goto
27480 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20 20         B        
27490 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f          # The lo
274a0 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a  op is finished..
274b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
274c0 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64      A: <loop bod
274d0 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y>              
274e0 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74 61     # Return data
274f0 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20  , whatever..    
27500 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
27510 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32 20     Return     2 
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
27530 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   Jump back to th
27540 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20  e Gosub.    **. 
27550 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c     **       B: <
27560 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a  after the loop>.
27570 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20      **.    */.  
27580 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
27590 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20  OrWc;    /* The 
275a0 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e  OR-clause broken
275b0 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72   out into subter
275c0 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ms */.    WhereT
275d0 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20  erm *pFinal;    
275e0 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62 74 65 72   /* Final subter
275f0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f 52 2d  m within the OR-
27600 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 53  clause. */.    S
27610 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20  rcList *pOrTab; 
27620 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e        /* Shorten
27630 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72  ed table list or
27640 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72   OR-clause gener
27650 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e  ation */..    in
27660 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
27670 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
27680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
27690 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
276a0 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
276b0 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
276e0 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
276f0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
27700 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27720 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
27730 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
27740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
27750 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
27760 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
27770 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
27780 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
27790 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
277c0 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
277d0 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
277e0 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
277f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27800 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
27810 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
27820 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
27830 69 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d  i;.   .    pTerm
27840 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
27850 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73  u.pTerm;.    ass
27860 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
27870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
27880 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
27890 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
278a0 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
278b0 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
278c0 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
278d0 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
278e0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
278f0 70 46 69 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d  pFinal = &pOrWc-
27900 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  >a[pOrWc->nTerm-
27910 31 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  1];.    pLevel->
27920 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
27930 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
27940 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
27950 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
27960 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54   SrcList ni pOrT
27970 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
27980 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
27990 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
279a0 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
279b0 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
279c0 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
279d0 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
279e0 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
279f0 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
27a00 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
27a10 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
27a20 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
27a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27a40 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
27a50 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
27a60 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
27a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27a80 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
27a90 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
27aa0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
27ab0 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
27ac0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
27ad0 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
27ae0 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
27af0 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
27b00 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
27b10 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
27b20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
27b30 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
27b40 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
27b60 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
27b70 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
27b80 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
27b90 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
27ba0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
27bb0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
27bc0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
27bd0 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
27be0 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
27bf0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
27c00 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
27c10 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
27c20 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
27c30 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
27c40 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
27c50 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
27c60 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
27c70 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
27c80 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
27c90 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
27ca0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
27cb0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
27cc0 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
27cd0 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
27ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27cf0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
27d00 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
27d10 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
27d20 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
27d30 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
27d40 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
27d50 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
27d60 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
27d70 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
27d80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
27d90 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
27da0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
27db0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
27dc0 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
27dd0 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
27de0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
27df0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
27e00 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
27e10 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
27e20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
27e30 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
27e40 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
27e50 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
27e60 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
27e70 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
27e80 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
27e90 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
27ea0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
27eb0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
27ec0 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
27ed0 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
27ee0 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
27ef0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
27f00 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
27f10 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
27f20 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
27f30 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
27f40 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
27f50 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
27f60 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
27f70 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
27f80 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
27f90 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
27fa0 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
27fb0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
27fc0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
27fd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
27fe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27ff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28000 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
28010 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
28020 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
28030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28040 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
28050 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66  gReturn);..    f
28060 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
28070 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
28080 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
28090 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
280a0 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
280b0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
280c0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
280d0 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  | pOrTerm->eOper
280e0 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a  ator==WO_AND ){.
280f0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
28100 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
28110 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
28120 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
28130 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
28140 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
28150 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
28160 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
28170 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
28180 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
28190 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
281a0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
281b0 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
281c0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20  WHERE_OMIT_OPEN 
281f0 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f  | WHERE_OMIT_CLO
28200 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
28220 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
28230 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
28240 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69  ONLY);.        i
28250 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
28260 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
28270 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
28280 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
28290 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
282a0 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
282b0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
282c0 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
282d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
282e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
282f0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
28300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
28310 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
28320 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
28330 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
28340 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
28350 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
28360 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
28370 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
28380 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
28390 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b 0a 20      regRowid);. 
283d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
283e0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
283f0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
28400 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
28430 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
28440 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
28450 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
28460 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28480 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
28490 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
284a0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
284b0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
284c0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
284d0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
284e0 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
284f0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
28500 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
28510 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
28520 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
28530 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
28540 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
28550 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
28560 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
28570 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
28580 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
28590 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
285a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
285b0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
285c0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
285d0 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
285e0 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
285f0 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
28600 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
28610 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
28620 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
28630 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
28640 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
28650 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
28660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28670 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28680 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
28690 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
286a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
286b0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
286c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
286d0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
286e0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
286f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28700 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
28710 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
28720 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
28730 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
28740 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  kFree(pParse->db
28750 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
28760 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
28770 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
28780 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
28790 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
287a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
287b0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
287c0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
287d0 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
287e0 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
287f0 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
28800 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
28810 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
28820 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
28830 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
28840 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
28850 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
28860 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
28870 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
28880 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
28890 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
288a0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
288b0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
288c0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
288d0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
288e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
288f0 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
28900 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
28910 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
28920 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
28930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28940 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
28950 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
28960 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
28970 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
28980 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
28990 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
289a0 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
289b0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
289c0 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
289d0 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
289e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
289f0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
28a00 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
28a10 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
28a20 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
28a30 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  les..  **.  ** I
28a40 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
28a50 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20  : R-49525-50935 
28a60 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f  Terms that canno
28a70 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74  t be satisfied t
28a80 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
28a90 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62  use of indices b
28aa0 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74  ecome tests that
28ab0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
28ac0 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20  gainst each row 
28ad0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65  of.  ** the rele
28ae0 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65  vant input table
28af0 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 30 3b  s..  */.  k = 0;
28b00 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
28b10 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
28b20 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
28b30 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
28b40 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73  *pE;.    testcas
28b50 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
28b60 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
28b70 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30   ); /* IMP: R-30
28b80 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
28b90 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
28ba0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
28bb0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
28bc0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
28bd0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
28be0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
28bf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
28c00 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
28c10 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
28c20 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
28c30 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
28c40 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
28c60 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
28c70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
28c80 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
28c90 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
28ca0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
28cb0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
28cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
28cd0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
28ce0 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
28cf0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
28d00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
28d10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28d20 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
28d30 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
28d40 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
28d50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28d60 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
28d70 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
28d80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
28d90 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70 54 65 72   k = 1;.    pTer
28da0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
28db0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
28dc0 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
28dd0 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
28de0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
28df0 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
28e00 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
28e10 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
28e20 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
28e30 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
28e40 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
28e50 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
28e60 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
28e70 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
28e80 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
28e90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28ea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28eb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
28ec0 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
28ed0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
28ee0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28ef0 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
28f00 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
28f10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28f20 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
28f30 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
28f40 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
28f50 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
28f60 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
28f70 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
28f80 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
28f90 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
28fa0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
28fb0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
28fc0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
28fd0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
28fe0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
28ff0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
29000 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
29010 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
29020 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
29030 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
29040 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
29050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29060 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
29070 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
29080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29090 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
290a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
290b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
290c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
290d0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
290e0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
290f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
29100 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
29110 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
29120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
29130 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
29140 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
29150 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
29160 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  urn notReady;.}.
29170 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
29180 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
29190 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
291a0 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
291b0 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
291c0 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
291d0 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
291e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
291f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
29200 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
29210 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
29220 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
29230 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
29240 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
29250 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
29260 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
29270 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
29280 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
29290 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
292a0 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
292b0 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
292c0 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
292e0 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
292f0 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
29300 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
29310 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
29320 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
29330 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
29340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29350 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
29360 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
29370 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
29380 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
29390 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fo) ){.    int i
293a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
293b0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
293c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
293d0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
293e0 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d  *pInfo = pWInfo-
293f0 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[i].pIdxInfo;.
29400 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20        if( pInfo 
29410 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73  ){.        /* as
29420 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65  sert( pInfo->nee
29430 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
29440 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
29450 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20  iled ); */.     
29460 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
29470 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
29480 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
29490 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
294a0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
294b0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
294c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e  e3DbFree(db, pIn
294d0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
294e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61     if( pWInfo->a
294f0 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [i].plan.wsFlags
29500 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
29510 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49  DEX ){.        I
29520 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49  ndex *pIdx = pWI
29530 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75  nfo->a[i].plan.u
29540 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  .pIdx;.        i
29550 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
29560 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
29570 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f  ee(db, pIdx->zCo
29580 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  lAff);.         
29590 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
295a0 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  b, pIdx);.      
295b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
295c0 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  }.    whereClaus
295d0 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70  eClear(pWInfo->p
295e0 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  WC);.    sqlite3
295f0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
29600 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  o);.  }.}.../*.*
29610 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
29620 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
29630 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
29640 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
29650 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
29660 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
29670 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
29680 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
29690 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
296a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
296b0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
296c0 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
296d0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
296e0 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
296f0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
29700 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
29710 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
29720 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
29730 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
29740 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
29750 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
29760 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
29770 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
29780 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29790 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
297a0 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
297b0 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
297c0 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
297d0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
297e0 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
297f0 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
29800 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
29810 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
29820 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
29830 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
29840 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
29850 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
29860 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
29870 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
29880 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
29890 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
298a0 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
298b0 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
298c0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
298d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
298e0 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
298f0 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
29900 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
29910 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
29920 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
29930 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
29940 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
29950 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
29960 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
29970 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
29980 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
29990 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
299a0 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
299b0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
299c0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
299d0 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
299e0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
299f0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a10 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
29a20 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
29a30 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a50 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
29a60 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
29a70 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
29a80 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
29a90 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
29aa0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
29ab0 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
29ac0 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
29ad0 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
29ae0 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
29af0 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
29b00 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
29b10 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
29b20 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
29b30 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
29b40 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
29b50 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
29b60 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
29b70 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
29b80 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
29b90 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
29ba0 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
29bb0 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
29bc0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
29bd0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
29be0 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
29bf0 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
29c00 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
29c10 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
29c20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
29c30 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
29c40 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
29c50 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
29c60 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
29c70 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
29c80 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
29c90 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
29ca0 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
29cb0 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
29cc0 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
29cd0 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
29ce0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
29cf0 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
29d00 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
29d10 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
29d20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
29d30 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
29d40 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
29d50 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
29d60 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
29d70 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
29d80 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
29d90 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
29da0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
29db0 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
29dc0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
29dd0 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
29de0 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
29df0 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
29e00 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
29e10 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
29e20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
29e30 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
29e40 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
29e50 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
29e60 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
29e70 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
29e80 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
29e90 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29ea0 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
29eb0 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
29ec0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
29ed0 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
29ee0 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
29ef0 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
29f00 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
29f10 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
29f20 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
29f30 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
29f40 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
29f50 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
29f60 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
29f70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
29f80 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
29f90 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
29fa0 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
29fb0 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
29fc0 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
29fd0 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
29fe0 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
29ff0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
2a000 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
2a010 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
2a020 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a030 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
2a040 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
2a050 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
2a060 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
2a070 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
2a080 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
2a090 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
2a0a0 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
2a0b0 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
2a0c0 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
2a0d0 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
2a0e0 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
2a0f0 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
2a100 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
2a110 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
2a120 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
2a130 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
2a140 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
2a150 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a160 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
2a170 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
2a180 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
2a190 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2a1a0 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
2a1b0 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
2a1c0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2a1d0 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
2a1e0 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
2a1f0 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
2a200 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
2a210 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
2a220 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
2a230 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
2a240 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
2a250 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
2a260 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
2a270 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
2a280 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
2a290 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2a2a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
2a2b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2a2c0 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
2a2d0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2a2e0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2a2f0 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2a300 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2a310 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2a320 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a330 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2a340 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
2a350 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
2a360 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
2a370 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
2a380 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
2a390 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
2a3a0 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
2a3b0 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
2a3c0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2a3d0 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
2a3e0 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
2a3f0 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
2a400 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
2a410 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2a420 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
2a430 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
2a440 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
2a450 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
2a460 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
2a470 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
2a480 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
2a490 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
2a4a0 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
2a4b0 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
2a4c0 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
2a4d0 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
2a4e0 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
2a4f0 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
2a500 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
2a510 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
2a520 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
2a530 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
2a540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2a550 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2a560 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2a570 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2a580 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
2a590 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
2a5a0 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
2a5b0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
2a5c0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2a5d0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
2a5e0 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c  ist **ppOrderBy,
2a5f0 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
2a600 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
2a610 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2a620 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68  Distinct,  /* Th
2a630 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f  e select-list fo
2a640 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 69  r DISTINCT queri
2a650 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  es - or NULL */.
2a660 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2a670 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2a680 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
2a690 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
2a6a0 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b  qliteInt.h */.){
2a6b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a6e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
2a6f0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
2a700 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
2a710 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
2a720 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
2a730 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
2a740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a750 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
2a760 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
2a770 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2a780 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
2a790 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
2a7a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2a7b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2a7c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2a7d0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
2a7e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
2a7f0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
2a800 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
2a810 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
2a820 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
2a830 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
2a840 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ned */.  WhereMa
2a850 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
2a860 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
2a870 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
2a880 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
2a890 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
2a8a0 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
2a8b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
2a8c0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
2a8d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a8e0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
2a8f0 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   A single entry 
2a900 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f  from pTabList */
2a910 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2a920 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
2a930 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
2a940 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e  evel in the pWIn
2a950 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  fo list */.  int
2a960 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a980 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f  First unused FRO
2a990 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
2a9a0 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61   */.  int andFla
2a9b0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2a9c0 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69   /* AND-ed combi
2a9d0 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57  nation of all pW
2a9e0 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a  C->a[].wtFlags *
2a9f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa10 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2aa20 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ction */..  /* T
2aa30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
2aa40 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2aa50 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
2aa60 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2aa70 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
2aa80 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
2aa90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
2aaa0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20  List->nSrc==BMS 
2aab0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  );.  if( pTabLis
2aac0 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
2aad0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2aae0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
2aaf0 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
2ab00 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
2ab10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2ab20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
2ab30 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67  ction normally g
2ab40 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65  enerates a neste
2ab50 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74  d loop for all t
2ab60 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70  ables in .  ** p
2ab70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66  TabList.  But if
2ab80 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41   the WHERE_ONETA
2ab90 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
2aba0 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
2abb0 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
2abc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2abd0 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
2abe0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
2abf0 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
2ac00 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
2ac10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
2ac20 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
2ac30 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
2ac40 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
2ac50 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
2ac60 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
2ac70 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54  E_ONLY) ? 1 : pT
2ac80 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
2ac90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2aca0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
2acb0 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2acc0 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
2acd0 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
2ace0 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
2acf0 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
2ad00 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2ad10 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
2ad20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
2ad30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
2ad40 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
2ad50 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
2ad60 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
2ad70 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2ad80 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
2ad90 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
2ada0 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
2adb0 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
2adc0 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
2add0 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
2ade0 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
2adf0 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
2ae00 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
2ae10 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
2ae20 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64   below..  */.  d
2ae30 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2ae40 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
2ae50 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
2ae60 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
2ae70 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
2ae80 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
2ae90 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
2aea0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
2aeb0 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b      nByteWInfo +
2aec0 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57   .      sizeof(W
2aed0 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20  hereClause) +.  
2aee0 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
2aef0 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20  MaskSet).  );.  
2af00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2af10 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
2af20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
2af30 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
2af40 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
2af50 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2af60 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
2af70 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
2af80 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
2af90 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
2afa0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
2afb0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
2afc0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
2afd0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2afe0 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
2aff0 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28 57  ->pWC = pWC = (W
2b000 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28  hereClause *)&((
2b010 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79  u8 *)pWInfo)[nBy
2b020 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e  teWInfo];.  pWIn
2b030 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2b040 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2b050 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2b060 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
2b070 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
2b080 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65  MaskSet = (Where
2b090 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d  MaskSet*)&pWC[1]
2b0a0 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  ;..  /* Split th
2b0b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2b0c0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
2b0d0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
2b0e0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
2b0f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
2b100 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
2b110 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
2b120 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
2b130 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
2b140 43 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20  ClauseInit(pWC, 
2b150 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
2b160 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b170 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  CodeConstants(pP
2b180 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
2b190 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2b1a0 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2b1b0 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35  ;   /* IMP: R-15
2b1c0 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20  842-53296 */.   
2b1d0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2b1e0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
2b1f0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
2b200 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
2b210 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
2b220 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
2b230 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
2b240 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
2b250 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
2b260 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
2b270 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
2b280 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2b290 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
2b2a0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2b2b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2b2c0 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
2b2d0 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
2b2e0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2b2f0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
2b300 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
2b310 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2b320 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2b330 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2b340 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2b350 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
2b360 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
2b370 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
2b380 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
2b390 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
2b3a0 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
2b3b0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2b3c0 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
2b3d0 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
2b3e0 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
2b3f0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
2b400 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
2b410 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
2b420 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
2b430 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
2b440 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2b450 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
2b460 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
2b470 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
2b480 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
2b490 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
2b4a0 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
2b4b0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
2b4c0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
2b4d0 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
2b4e0 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
2b4f0 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
2b500 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
2b510 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2b520 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
2b530 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
2b540 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
2b550 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
2b560 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2b570 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
2b580 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
2b590 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
2b5a0 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
2b5b0 20 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61   WhereClause.vma
2b5c0 73 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74  sk variable so t
2b5d0 68 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f  hat bits that co
2b5e0 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f  rrespond.  ** to
2b5f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
2b600 75 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20  ursors are set. 
2b610 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
2b620 73 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61  selectively disa
2b630 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52  ble .  ** the OR
2b640 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d  -to-IN transform
2b650 61 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61  ation in exprAna
2b660 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74  lyzeOrTerm(). It
2b670 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20   is not helpful 
2b680 0a 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75  .  ** with virtu
2b690 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  al tables..  **.
2b6a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2b6b0 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2b6c0 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2b6d0 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2b6e0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
2b6f0 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
2b700 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
2b710 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
2b720 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
2b730 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
2b740 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
2b750 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
2b760 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
2b770 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
2b780 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
2b790 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
2b7a0 74 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30  t( pWC->vmask==0
2b7b0 20 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d   && pMaskSet->n=
2b7c0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
2b7d0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2b7e0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
2b7f0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
2b800 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
2b810 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64  .iCursor);.#ifnd
2b820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2b830 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2b840 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c  if( ALWAYS(pTabL
2b850 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20  ist->a[i].pTab) 
2b860 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
2b870 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2b880 29 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  ) ){.      pWC->
2b890 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61  vmask |= ((Bitma
2b8a0 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20  sk)1 << i);.    
2b8b0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
2b8c0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2b8d0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2b8e0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2b8f0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2b900 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2b910 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
2b920 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2b930 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2b940 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2b950 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
2b960 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
2b970 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
2b980 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
2b990 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
2b9a0 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
2b9b0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
2b9c0 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
2b9d0 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
2b9e0 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
2b9f0 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
2ba00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2ba10 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
2ba20 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
2ba30 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
2ba40 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
2ba50 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
2ba60 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
2ba70 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
2ba80 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
2ba90 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
2baa0 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
2bab0 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
2bac0 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
2bad0 54 61 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20  TabList, pWC);. 
2bae0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2baf0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2bb00 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2bb10 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  r;.  }..  /* Che
2bb20 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ck if the DISTIN
2bb30 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66  CT qualifier, if
2bb40 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69   there is one, i
2bb50 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20  s redundant. .  
2bb60 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2bb70 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20  n set pDistinct 
2bb80 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72  to NULL and Wher
2bb90 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20  eInfo.eDistinct 
2bba0 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49  to.  ** WHERE_DI
2bbb0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f  STINCT_UNIQUE to
2bbc0 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72   tell the caller
2bbd0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44   to ignore the D
2bbe0 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20  ISTINCT..  */.  
2bbf0 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26  if( pDistinct &&
2bc00 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2bc10 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2bc20 62 4c 69 73 74 2c 20 70 57 43 2c 20 70 44 69 73  bList, pWC, pDis
2bc30 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44  tinct) ){.    pD
2bc40 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2bc50 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2bc60 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2bc70 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a  NCT_UNIQUE;.  }.
2bc80 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20  .  /* Chose the 
2bc90 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
2bca0 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
2bcb0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2bcc0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
2bcd0 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69  his loop fills i
2bce0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2bcf0 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a  fields:.  **.  *
2bd00 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2bd10 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e  pIdx      The in
2bd20 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2bd30 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  his level of the
2bd40 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57   loop..  **   pW
2bd50 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67  Info->a[].wsFlag
2bd60 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c  s   WHERE_xxx fl
2bd70 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
2bd80 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20  ith pIdx.  **   
2bd90 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20  pWInfo->a[].nEq 
2bda0 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72        The number
2bdb0 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f   of == and IN co
2bdc0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20  nstraints.  **  
2bdd0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72   pWInfo->a[].iFr
2bde0 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72  om     Which ter
2bdf0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
2be00 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
2be10 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
2be20 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
2be30 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
2be40 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2be50 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
2be60 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
2be70 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
2be80 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
2be90 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ex.  **   pWInfo
2bea0 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20  ->a[].pTerm     
2beb0 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f  When wsFlags==WO
2bec0 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75  _OR, the OR-clau
2bed0 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a  se term.  **.  *
2bee0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2bef0 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
2bf00 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
2bf10 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
2bf20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
2bf30 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
2bf40 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2bf50 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54  .  pTabItem = pT
2bf60 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65  abList->a;.  pLe
2bf70 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
2bf80 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30  .  andFlags = ~0
2bf90 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
2bfa0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
2bfb0 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
2bfc0 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
2bfd0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2bfe0 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2bff0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2c000 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74    WhereCost best
2c010 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  Plan;         /*
2c020 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20   Most efficient 
2c030 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72  plan seen so far
2c040 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
2c050 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2c060 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
2c070 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70   FROM table at p
2c080 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69  TabItem */.    i
2c090 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
2c0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2c0b0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
2c0c0 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
2c0d0 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31    int bestJ = -1
2c0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c0f0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20   The value of j 
2c100 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
2c110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c120 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61     /* Bitmask va
2c130 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73  lue for j or bes
2c140 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  tJ */.    int is
2c150 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20  Optimal;        
2c160 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2c170 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f  r for optimal/no
2c180 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68  n-optimal search
2c190 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63   */.    int nUnc
2c1a0 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20  onstrained;     
2c1b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61      /* Number ta
2c1c0 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44  bles without IND
2c1d0 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42  EXED BY */.    B
2c1e0 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65  itmask notIndexe
2c1f0 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  d;         /* Ma
2c200 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
2c210 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  t cannot use an 
2c220 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65  index */..    me
2c230 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
2c240 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
2c250 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
2c260 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  an.rCost = SQLIT
2c270 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57  E_BIG_DBL;.    W
2c280 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2c290 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72  Begin search for
2c2a0 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c   loop %d ***\n",
2c2b0 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   i));..    /* Lo
2c2c0 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  op through the r
2c2d0 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73  emaining entries
2c2e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c2f0 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  use to find the.
2c300 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74      ** next nest
2c310 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f  ed loop. The loo
2c320 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d  p tests all FROM
2c330 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a   clause entries.
2c340 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e      ** either on
2c350 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20  ce or twice. .  
2c360 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2c370 66 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c  first test is al
2c380 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69  ways performed i
2c390 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
2c3a0 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a  or more entries.
2c3b0 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67      ** remaining
2c3c0 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f   and never perfo
2c3d0 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73  rmed if there is
2c3e0 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63   only one FROM c
2c3f0 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20  lause entry.    
2c400 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f  ** to choose fro
2c410 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65  m.  The first te
2c420 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20  st looks for an 
2c430 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20  "optimal" scan. 
2c440 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   In.    ** this 
2c450 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d  context an optim
2c460 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74  al scan is one t
2c470 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d  hat uses the sam
2c480 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a  e strategy.    *
2c490 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * for the given 
2c4a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2c4b0 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65  y as would be se
2c4c0 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e  lected if the en
2c4d0 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20  try.    ** were 
2c4e0 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65  used as the inne
2c4f0 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f  rmost nested loo
2c500 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  p.  In other wor
2c510 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20  ds, a table.    
2c520 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63  ** is chosen suc
2c530 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  h that the cost 
2c540 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20  of running that 
2c550 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
2c560 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62  reduced.    ** b
2c570 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74  y waiting for ot
2c580 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75  her tables to ru
2c590 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22  n first.  This "
2c5a0 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f  optimal" test wo
2c5b0 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69  rks.    ** by fi
2c5c0 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61  rst assuming tha
2c5d0 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  t the FROM claus
2c5e0 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65  e is on the inne
2c5f0 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69  r loop and findi
2c600 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75  ng.    ** its qu
2c610 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63  ery plan, then c
2c620 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69  hecking to see i
2c630 66 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61  f that query pla
2c640 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a  n uses any.    *
2c650 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  * other FROM cla
2c660 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61  use terms that a
2c670 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66  re notReady.  If
2c680 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72   no notReady ter
2c690 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73  ms are.    ** us
2c6a0 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74  ed then the "opt
2c6b0 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e  imal" query plan
2c6c0 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20   works..    **. 
2c6d0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2c6e0 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52  the WhereCost.nR
2c6f0 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  ow parameter for
2c700 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
2c710 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f   might.    ** no
2c720 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73  t be as small as
2c730 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20   it would be if 
2c740 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79  the table really
2c750 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d   were the innerm
2c760 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e  ost.    ** join.
2c770 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
2c780 20 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 20   can be reduced 
2c790 62 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  by WHERE clause 
2c7a0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
2c7b0 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ** that do not u
2c7c0 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74  se indices.  But
2c7d0 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63   this nRow reduc
2c7e0 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e  tion only happen
2c7f0 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s if the.    ** 
2c800 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  table really is 
2c810 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f  the innermost jo
2c820 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  in.  .    **.   
2c830 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c   ** The second l
2c840 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73  oop iteration is
2c850 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20   only performed 
2c860 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63  if no optimal sc
2c870 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65  an.    ** strate
2c880 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20  gies were found 
2c890 62 79 20 74 68 65 20 66 69 72 73 74 20 69 74 65  by the first ite
2c8a0 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63  ration. This sec
2c8b0 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20  ond iteration.  
2c8c0 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20    ** is used to 
2c8d0 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c  search for the l
2c8e0 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20  owest cost scan 
2c8f0 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a  overall..    **.
2c900 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20      ** Previous 
2c910 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2c920 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c  te performed onl
2c930 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  y the second ite
2c940 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20  ration -.    ** 
2c950 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f  the next outermo
2c960 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61  st loop was alwa
2c970 79 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65  ys that with the
2c980 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a   lowest overall.
2c990 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77      ** cost. How
2c9a0 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74  ever, this meant
2c9b0 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75   that SQLite cou
2c9c0 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72  ld select the wr
2c9d0 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  ong plan.    ** 
2c9e0 66 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68  for scripts such
2c9f0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
2ca00 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20  g:.    **   .   
2ca10 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
2ca20 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20  LE t1(a, b); .  
2ca30 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
2ca40 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20  BLE t2(c, d);.  
2ca50 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
2ca60 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52  FROM t2, t1 WHER
2ca70 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e  E t2.rowid = t1.
2ca80 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  a;.    **.    **
2ca90 20 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65   The best strate
2caa0 67 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65  gy is to iterate
2cab0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2cac0 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72  1 first. However
2cad0 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
2cae0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  t possible to de
2caf0 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74  termine this wit
2cb00 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  h a simple greed
2cb10 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20  y algorithm..   
2cb20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   ** Since the co
2cb30 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
2cb40 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
2cb50 65 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65  e t2 is the same
2cb60 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20   .    ** as the 
2cb70 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
2cb80 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
2cb90 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65  ble t1, a simple
2cba0 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20   greedy .    ** 
2cbb0 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68  algorithm may ch
2cbc0 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66  oose to use t2 f
2cbd0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  or the outer loo
2cbe0 70 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75  p, which is a mu
2cbf0 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69  ch.    ** costli
2cc00 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20  er approach..   
2cc10 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74   */.    nUnconst
2cc20 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20  rained = 0;.    
2cc30 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a  notIndexed = 0;.
2cc40 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61      for(isOptima
2cc50 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73  l=(iFrom<nTabLis
2cc60 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e  t-1); isOptimal>
2cc70 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69  =0 && bestJ<0; i
2cc80 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20  sOptimal--){.   
2cc90 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b     Bitmask mask;
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ccb0 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e  Mask of tables n
2ccc0 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a  ot yet ready */.
2ccd0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f        for(j=iFro
2cce0 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61  m, pTabItem=&pTa
2ccf0 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e  bList->a[j]; j<n
2cd00 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54  TabList; j++, pT
2cd10 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20  abItem++){.     
2cd20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72     int doNotReor
2cd30 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  der;    /* True 
2cd40 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68  if this table sh
2cd50 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72  ould not be reor
2cd60 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
2cd70 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74   WhereCost sCost
2cd80 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e  ;     /* Cost in
2cd90 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
2cda0 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65  est[Virtual]Inde
2cdb0 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  x() */.        E
2cdc0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2cdd0 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  y;  /* ORDER BY 
2cde0 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78  clause for index
2cdf0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a   to optimize */.
2ce00 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2ce10 20 2a 70 44 69 73 74 3b 20 20 20 20 20 2f 2a 20   *pDist;     /* 
2ce20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
2ce30 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74  for index to opt
2ce40 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20  imize */.  .    
2ce50 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
2ce60 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
2ce70 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2ce80 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2ce90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 21  ;.        if( j!
2cea0 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52  =iFrom && doNotR
2ceb0 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
2cec0 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d          m = getM
2ced0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2cee0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
2cef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
2cf00 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
2cf10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2cf20 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f   j==iFrom ) iFro
2cf30 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  m++;.          c
2cf40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2cf50 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20   }.        mask 
2cf60 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d  = (isOptimal ? m
2cf70 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20   : notReady);.  
2cf80 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
2cf90 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64   ((i==0 && ppOrd
2cfa0 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42  erBy )?*ppOrderB
2cfb0 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44  y:0);.        pD
2cfc0 69 73 74 20 3d 20 28 69 3d 3d 30 20 3f 20 70 44  ist = (i==0 ? pD
2cfd0 69 73 74 69 6e 63 74 20 3a 20 30 29 3b 0a 20 20  istinct : 0);.  
2cfe0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 49 74        if( pTabIt
2cff0 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  em->pIndex==0 ) 
2d000 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2d010 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2d020 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72  RETRACE(("=== tr
2d030 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69  ying table %d wi
2d040 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20  th isOptimal=%d 
2d050 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ===\n",.        
2d060 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69              j, i
2d070 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2d080 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2d090 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69  Item->pTab );.#i
2d0a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d0b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2d0c0 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
2d0d0 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
2d0e0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2d0f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2d100 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49  info **pp = &pWI
2d110 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
2d120 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  fo;.          be
2d130 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
2d140 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
2d150 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52  Item, mask, notR
2d160 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a  eady, pOrderBy,.
2d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d180 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f 73             &sCos
2d190 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20  t, pp);.        
2d1a0 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20  }else .#endif.  
2d1b0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d1c0 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
2d1d0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2d1e0 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f  abItem, mask, no
2d1f0 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
2d200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d210 70 44 69 73 74 2c 20 26 73 43 6f 73 74 29 3b 0a  pDist, &sCost);.
2d220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d230 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74 69    assert( isOpti
2d240 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73  mal || (sCost.us
2d250 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20  ed&notReady)==0 
2d260 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  );..        /* I
2d270 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  f an INDEXED BY 
2d280 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
2d290 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61 6e  t, then the plan
2d2a0 20 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a 20   must use that. 
2d2b0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
2d2c0 69 66 20 69 74 20 75 73 65 73 20 61 6e 79 20 69  if it uses any i
2d2d0 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20  ndex at all */. 
2d2e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d2f0 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d  TabItem->pIndex=
2d300 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2d310 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e        || (sCost.
2d320 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d330 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2d340 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
2d350 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73 74          || sCost
2d360 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54  .plan.u.pIdx==pT
2d370 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29  abItem->pIndex )
2d380 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ;..        if( i
2d390 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43 6f  sOptimal && (sCo
2d3a0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2d3b0 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2d3c0 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
2d3d0 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64        notIndexed
2d3e0 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d   |= m;.        }
2d3f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ..        /* Con
2d400 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68  ditions under wh
2d410 69 63 68 20 74 68 69 73 20 74 61 62 6c 65 20 62  ich this table b
2d420 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20  ecomes the best 
2d430 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20  so far:.        
2d440 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2d450 28 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75  (1) The table mu
2d460 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e  st not depend on
2d470 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 68   other tables th
2d480 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20  at have not.    
2d490 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74      **       yet
2d4a0 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a   run..        **
2d4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32  .        **   (2
2d4c0 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  ) A full-table-s
2d4d0 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20  can plan cannot 
2d4e0 73 75 70 65 72 63 65 64 65 20 69 6e 64 65 78 65  supercede indexe
2d4f0 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20  d plan unless.  
2d500 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
2d510 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63  he full-table-sc
2d520 61 6e 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61  an is an "optima
2d530 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e  l" plan as defin
2d540 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
2d550 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2d560 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73    (3) All tables
2d570 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44   have an INDEXED
2d580 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68   BY clause or th
2d590 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61  is table lacks a
2d5a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  n.        **    
2d5b0 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c     INDEXED BY cl
2d5c0 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62  ause or this tab
2d5d0 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65 63  le uses the spec
2d5e0 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20  ific.        ** 
2d5f0 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65 63        index spec
2d600 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e 44  ified by its IND
2d610 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
2d620 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72   This rule ensur
2d630 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  es.        **   
2d640 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74 2d      that a best-
2d650 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73  so-far is always
2d660 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69   selected even i
2d670 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a  f an impossible.
2d680 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2d690 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
2d6a0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2d6b0 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54  es are given.  T
2d6c0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
2d6d0 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62   **       will b
2d6e0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
2d6f0 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74  elayed back to t
2d700 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c  he application l
2d710 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ater..        **
2d720 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45 52         The NEVER
2d730 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62  () comes about b
2d740 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29 20  ecause rule (2) 
2d750 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20  above prevents. 
2d760 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2d770 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c  An indexable ful
2d780 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f  l-table-scan fro
2d790 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20  m reaching rule 
2d7a0 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  (3)..        **.
2d7b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29          **   (4)
2d7c0 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d   The plan cost m
2d7d0 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61  ust be lower tha
2d7e0 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72  n prior plans or
2d7f0 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20   else the.      
2d800 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20    **       cost 
2d810 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
2d820 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
2d830 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20  of rows must be 
2d840 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  lower..        *
2d850 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73  /.        if( (s
2d860 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61  Cost.used&notRea
2d870 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  dy)==0          
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d890 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
2d8a0 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
2d8b0 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29  | (notIndexed&m)
2d8c0 21 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  !=0             
2d8d0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2d8f0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2d900 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2d910 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2d930 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73  | (sCost.plan.ws
2d940 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2d950 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a  T_FULLSCAN)!=0).
2d960 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2d970 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
2d980 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70  0 || pTabItem->p
2d990 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33  Index==0   /* (3
2d9a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2d9b0 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73       || NEVER((s
2d9c0 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2d9d0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2d9e0 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20  LLSCAN)!=0)).   
2d9f0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
2da00 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43  tJ<0 || sCost.rC
2da10 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f  ost<bestPlan.rCo
2da20 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a  st      /* (4) *
2da30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2da40 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73    || (sCost.rCos
2da50 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  t<=bestPlan.rCos
2da60 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
2da70 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61      && sCost.pla
2da80 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e  n.nRow<bestPlan.
2da90 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20  plan.nRow)).    
2daa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2dab0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d   WHERETRACE(("==
2dac0 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20 62 65  = table %d is be
2dad0 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20  st so far".     
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2daf0 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2db00 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db20 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72        j, sCost.r
2db30 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e  Cost, sCost.plan
2db40 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20  .nRow));.       
2db50 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
2db60 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ost;.          b
2db70 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
2db80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2db90 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2dba0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2dbb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2dbc0 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
2dbd0 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
2dbe0 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
2dbf0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2dc00 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2dc10 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
2dc20 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2dc30 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
2dc40 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22   %d for loop %d"
2dc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc60 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2dc70 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc90 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57  bestJ, pLevel-pW
2dca0 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61  Info->a, bestPla
2dcb0 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61  n.rCost, bestPla
2dcc0 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20  n.plan.nRow));. 
2dcd0 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2dce0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2dcf0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d  WHERE_ORDERBY)!=
2dd00 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72  0 ){.      *ppOr
2dd10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
2dd20 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c  .    if( (bestPl
2dd30 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2dd40 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2dd50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
2dd60 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44  sert( pWInfo->eD
2dd70 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
2dd80 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2dd90 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2dda0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2ddb0 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
2ddc0 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
2ddd0 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
2dde0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
2ddf0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
2de00 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
2de10 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2de20 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2de30 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ED );.    testca
2de40 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  se( bestPlan.pla
2de50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2de60 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a  E_TEMP_INDEX );.
2de70 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2de80 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2de90 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2dea0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2deb0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
2dec0 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
2ded0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2dee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
2def0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
2df00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
2df10 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
2df20 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2df30 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
2df40 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
2df50 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
2df60 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20  )bestJ;.    if( 
2df70 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2df80 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  ow>=(double)1 ){
2df90 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2dfa0 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73  QueryLoop *= bes
2dfb0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  tPlan.plan.nRow;
2dfc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2dfd0 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
2dfe0 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62   table scanned b
2dff0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  y this loop iter
2e000 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20  ation had an.   
2e010 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63   ** INDEXED BY c
2e020 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
2e030 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e  o it, that the n
2e040 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65  amed index is be
2e050 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  ing.    ** used 
2e060 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66  for the scan. If
2e070 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79   not, then query
2e080 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73   compilation has
2e090 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   failed..    ** 
2e0a0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  Return an error.
2e0b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
2e0c0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62   = pTabList->a[b
2e0d0 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20  estJ].pIndex;.  
2e0e0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2e0f0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2e100 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2e110 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
2e120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2e130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e140 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
2e150 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49  e index: %s", pI
2e160 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2e170 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2e180 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  ginError;.      
2e190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2e1a0 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
2e1b0 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65  BY clause is use
2e1c0 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  d, the bestIndex
2e1d0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  () function is. 
2e1e0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
2e1f0 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  teed to find the
2e200 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
2e210 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20   in the INDEXED 
2e220 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
2e230 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20    ** if it find 
2e240 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  an index at all.
2e250 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2e260 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  rt( bestPlan.pla
2e270 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29  n.u.pIdx==pIdx )
2e280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e290 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
2e2a0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2e2b0 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
2e2c0 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ));.  if( pParse
2e2d0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2e2e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2e2f0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2e300 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
2e310 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
2e320 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
2e330 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
2e340 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
2e350 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
2e360 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
2e370 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
2e380 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
2e390 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
2e3a0 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
2e3b0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
2e3c0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
2e3d0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
2e3e0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2e3f0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
2e400 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
2e410 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
2e420 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
2e430 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
2e440 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
2e450 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
2e460 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
2e470 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
2e480 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
2e490 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2e4a0 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
2e4b0 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
2e4c0 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
2e4d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2e4e0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2e4f0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
2e500 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
2e510 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2e520 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2e530 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46  RED)!=0 && (andF
2e540 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2e550 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  QUE)!=0 ){.    p
2e560 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
2e570 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
2e580 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[0].plan.wsFl
2e590 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
2e5a0 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  X_ONLY;.  }..  /
2e5b0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
2e5c0 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
2e5d0 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
2e5e0 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
2e5f0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
2e600 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2e610 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
2e620 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2e630 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
2e640 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
2e650 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
2e660 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
2e670 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f  mask)0;.  pWInfo
2e680 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75  ->nRowOut = (dou
2e690 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d 30  ble)1;.  for(i=0
2e6a0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2e6b0 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
2e6c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2e6d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2e6e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2e6f0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2e700 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2e710 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2e720 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2e730 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ble/index */..  
2e740 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2e750 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2e760 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
2e770 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
2e780 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
2e790 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
2e7a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2e7b0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2e7c0 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  t *= pLevel->pla
2e7d0 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20  n.nRow;.    iDb 
2e7e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2e7f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2e800 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
2e810 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2e820 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2e830 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2e840 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2e850 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2e860 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2e870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2e880 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2e890 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2e8a0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e8b0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2e8c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2e8d0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2e8e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2e8f0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2e900 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2e910 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2e920 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2e930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e940 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2e950 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2e960 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2e970 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2e980 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2e990 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2e9a0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2e9b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2e9c0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2e9d0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
2e9e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2e9f0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
2ea00 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
2ea10 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
2ea20 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
2ea30 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2ea40 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2ea50 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2ea60 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
2ea70 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
2ea80 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2ea90 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
2eaa0 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2eab0 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
2eac0 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
2ead0 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
2eae0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2eaf0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
2eb00 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
2eb10 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2eb20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
2eb30 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
2eb40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2eb50 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
2eb60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2eb70 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb90 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
2eba0 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
2ebb0 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
2ebc0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
2ebd0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
2ebe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2ebf0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2ec00 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2ec10 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2ec20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
2ec30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ec40 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2ec50 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
2ec60 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2ec70 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2ec80 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2ec90 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2eca0 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2ecb0 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2ecc0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2ecd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
2ece0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
2ecf0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2ed00 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2ed10 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
2ed20 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
2ed30 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
2ed40 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2ed50 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
2ed60 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
2ed70 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
2ed80 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
2ed90 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2eda0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2edb0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2edc0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2edd0 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
2ede0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
2edf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2ee00 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2ee10 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
2ee20 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee40 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
2ee50 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
2ee60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2ee70 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2ee80 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
2ee90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
2eea0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2eeb0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2eec0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
2eed0 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
2eee0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
2eef0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
2ef00 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2ef10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2ef20 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2ef30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2ef40 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2ef50 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2ef60 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2ef70 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2ef80 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2ef90 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2efa0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2efb0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2efc0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2efd0 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2efe0 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2eff0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2f000 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2f010 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74  (i=0; i<nTabList
2f020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76  ; i++){.    pLev
2f030 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2f040 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  i];.    explainO
2f050 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
2f060 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2f070 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
2f080 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
2f090 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
2f0a0 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2f0b0 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
2f0c0 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
2f0d0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2f0e0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2f0f0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
2f100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2f110 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
2f120 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2f130 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
2f140 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
2f150 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
2f160 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2f170 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
2f180 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
2f190 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
2f1a0 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
2f1b0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
2f1c0 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
2f1d0 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
2f1e0 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
2f1f0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
2f200 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
2f210 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
2f220 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
2f230 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
2f240 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
2f250 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
2f260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2f270 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  abList; i++){.  
2f280 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
2f290 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
2f2a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2f2b0 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
2f2c0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2f2d0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2f2e0 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
2f2f0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
2f300 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
2f310 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2f320 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
2f330 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
2f340 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2f350 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2f360 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
2f370 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
2f380 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f390 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2f3a0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Y ){.        mem
2f3b0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
2f3c0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
2f3d0 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20   "{}", 2);.     
2f3e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
2f3f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f400 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2f410 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2f420 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a  nQPlan], z, n);.
2f430 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
2f440 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
2f450 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
2f460 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
2f470 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
2f480 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
2f490 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2f4a0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
2f4b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2f4c0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2f4d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
2f4e0 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
2f4f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2f500 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
2f510 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
2f520 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
2f530 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2f540 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2f550 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
2f560 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
2f570 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
2f580 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d  lse if( (pLevel-
2f590 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2f5a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2f5b0 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  0 ){.      n = s
2f5c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
2f5d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2f5e0 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2f5f0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2f600 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2f610 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
2f620 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2f630 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2f640 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
2f650 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
2f660 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
2f670 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
2f680 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f690 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2f6a0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
2f6b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2f6c0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
2f6d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2f6e0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
2f6f0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
2f700 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  an += 3;.    }. 
2f710 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
2f720 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
2f730 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2f740 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
2f750 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2f760 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
2f770 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2f780 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2f790 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
2f7a0 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
2f7b0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
2f7c0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
2f7d0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
2f7e0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
2f7f0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
2f800 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
2f810 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
2f820 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
2f830 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
2f840 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  rn..  */.  retur
2f850 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
2f860 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
2f870 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
2f880 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
2f890 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
2f8a0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2f8b0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2f8c0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2f8d0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
2f8e0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2f8f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2f900 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2f910 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2f920 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
2f930 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
2f940 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f950 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
2f960 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2f970 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f980 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
2f990 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
2f9a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2f9b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2f9c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2f9d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2f9e0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
2f9f0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
2fa00 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2fa10 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2fa20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2fa30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2fa40 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
2fa50 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
2fa60 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
2fa70 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2fa80 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
2fa90 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2faa0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2fab0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2fac0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
2fad0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2fae0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2faf0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
2fb00 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
2fb10 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
2fb20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fb30 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op3(v, pLevel->o
2fb40 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
2fb50 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65 76 65  Level->p2, pLeve
2fb60 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 73 71  l->p3);.      sq
2fb70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2fb80 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29  5(v, pLevel->p5)
2fb90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fba0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2fbb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
2fbc0 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e  ABLE && pLevel->
2fbd0 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20  u.in.nIn>0 ){.  
2fbe0 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
2fbf0 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
2fc00 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
2fc10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2fc20 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
2fc30 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f  drNxt);.      fo
2fc40 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  r(j=pLevel->u.in
2fc50 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65  .nIn, pIn=&pLeve
2fc60 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b  l->u.in.aInLoop[
2fc70 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
2fc80 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
2fc90 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2fca0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
2fcb0 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20  InTop+1);.      
2fcc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fcd0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
2fce0 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
2fcf0 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
2fd00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2fd10 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2fd20 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
2fd30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2fd40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
2fd50 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
2fd60 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  op);.    }.    s
2fd70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2fd80 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2fd90 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
2fda0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2fdb0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
2fdc0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
2fdd0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2fde0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2fdf0 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
2fe00 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61  ftJoin);.      a
2fe10 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e  ssert( (pLevel->
2fe20 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2fe30 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2fe40 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
2fe50 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2fe60 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2fe70 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  DEXED)!=0 );.   
2fe80 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2fe90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2fea0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2feb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2fec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2fed0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
2fee0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2fef0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
2ff00 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2ff10 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20  >iIdxCur>=0 ){. 
2ff20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ff30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2ff40 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2ff50 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2ff60 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2ff70 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
2ff80 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
2ff90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ffa0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
2ffb0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2ffc0 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2ffd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ffe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fff0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
30000 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
30010 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rst);.      }.  
30020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30030 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
30040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
30050 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
30060 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
30070 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
30080 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
30090 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
300a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
300b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
300c0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
300d0 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
300e0 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
300f0 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
30100 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
30110 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61  eBegin..  */.  a
30120 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e  ssert( pWInfo->n
30130 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e  Level==1 || pWIn
30140 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62  fo->nLevel==pTab
30150 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
30160 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
30170 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49  pWInfo->a; i<pWI
30180 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
30190 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
301a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
301b0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
301c0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
301d0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
301e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
301f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
30200 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
30210 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
30220 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
30230 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
30240 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e  0.     && pTab->
30250 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20  pSelect==0.     
30260 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
30270 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
30280 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  MIT_CLOSE)==0.  
30290 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
302a0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
302b0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  .wsFlags;.      
302c0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
302d0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
302e0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
302f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
30300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30310 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
30320 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
30330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30340 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
30350 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
30360 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
30370 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NDEX)==0 ){.    
30380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30390 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
303a0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
303b0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
303c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
303d0 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
303e0 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65  index, make code
303f0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
30400 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
30410 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
30420 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20  x in preference 
30430 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f  to the table. So
30440 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65  metimes, this me
30450 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ans.    ** the t
30460 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20  able need never 
30470 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68  be read from. Th
30480 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61  is is a performa
30490 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a  nce boost,.    *
304a0 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65  * as the vdbe le
304b0 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20  vel waits until 
304c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61  the table is rea
304d0 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c  d before actuall
304e0 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67  y.    ** seeking
304f0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
30500 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  r to the record 
30510 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
30520 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
30530 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   ** position in 
30540 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
30550 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
30560 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
30570 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
30580 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30590 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
305a0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
305b0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
305c0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
305d0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
305e0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
305f0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
30600 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
30610 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
30620 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
30630 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
30640 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
30650 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
30660 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
30670 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
30680 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
30690 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
306a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
306b0 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21  INDEXED)!=0 && !
306c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
306d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
306e0 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
306f0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
30700 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
30710 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
30720 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
30730 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
30740 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
30750 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
30760 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
30770 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
30780 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
30790 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
307a0 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
307b0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
307c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
307d0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
307e0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
307f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
30800 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
30810 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
30820 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
30830 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
30840 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
30850 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
30860 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
30870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30880 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
308a0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
308b0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
308c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
308d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
308e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
308f0 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
30900 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
30910 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
30920 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
30930 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
30940 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
30950 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
30960 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
30970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
30980 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
30990 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
309a0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
309b0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
309c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
309d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
309e0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
309f0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
30a00 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
30a10 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
30a20 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
30a30 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
30a40 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.